[JFFS2] Calculate CRC check starting point correctly
When data starts from the beginning of NAND page, 'len' must be zero, not c->wbuf_page. Thanks to Zoltan Sogor for reporting this problem. Signed-off-by: Artem B. Bityutskiy <dedekind@infradead.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
8d5df40954
commit
280562b210
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
* For licensing information, see the file 'LICENCE' in this directory.
|
* For licensing information, see the file 'LICENCE' in this directory.
|
||||||
*
|
*
|
||||||
* $Id: nodelist.c,v 1.110 2005/08/17 14:13:45 dedekind Exp $
|
* $Id: nodelist.c,v 1.111 2005/08/17 14:57:39 dedekind Exp $
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -413,7 +413,8 @@ static int check_node_data(struct jffs2_sb_info *c, struct jffs2_tmp_dnode_info
|
|||||||
/* Calculate how many bytes were already checked */
|
/* Calculate how many bytes were already checked */
|
||||||
ofs = ref_offset(ref) + sizeof(struct jffs2_raw_inode);
|
ofs = ref_offset(ref) + sizeof(struct jffs2_raw_inode);
|
||||||
len = ofs & (c->wbuf_pagesize - 1);
|
len = ofs & (c->wbuf_pagesize - 1);
|
||||||
len = c->wbuf_pagesize - len;
|
if (likely(len))
|
||||||
|
len = c->wbuf_pagesize - len;
|
||||||
|
|
||||||
if (len >= tn->csize) {
|
if (len >= tn->csize) {
|
||||||
JFFS2_DBG_READINODE("no need to check node at %#08x, data length %u, data starts at %#08x - it has already been checked.\n",
|
JFFS2_DBG_READINODE("no need to check node at %#08x, data length %u, data starts at %#08x - it has already been checked.\n",
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
* For licensing information, see the file 'LICENCE' in this directory.
|
* For licensing information, see the file 'LICENCE' in this directory.
|
||||||
*
|
*
|
||||||
* $Id: readinode.c,v 1.140 2005/08/17 13:46:23 dedekind Exp $
|
* $Id: readinode.c,v 1.141 2005/08/17 14:57:39 dedekind Exp $
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -272,9 +272,9 @@ static inline int read_dnode(struct jffs2_sb_info *c, struct jffs2_raw_node_ref
|
|||||||
buf = (unsigned char *)rd + sizeof(*rd);
|
buf = (unsigned char *)rd + sizeof(*rd);
|
||||||
/* len will be the read data length */
|
/* len will be the read data length */
|
||||||
len = min_t(uint32_t, rdlen - sizeof(*rd), csize);
|
len = min_t(uint32_t, rdlen - sizeof(*rd), csize);
|
||||||
|
tn->partial_crc = crc32(0, buf, len);
|
||||||
|
|
||||||
if (len)
|
JFFS2_DBG_READINODE("Calculates CRC (%#08x) for %d bytes, csize %d\n", tn->partial_crc, len, csize);
|
||||||
tn->partial_crc = crc = crc32(0, buf, len);
|
|
||||||
|
|
||||||
/* If we actually calculated the whole data CRC
|
/* If we actually calculated the whole data CRC
|
||||||
* and it is wrong, drop the node. */
|
* and it is wrong, drop the node. */
|
||||||
@ -327,8 +327,8 @@ static inline int read_dnode(struct jffs2_sb_info *c, struct jffs2_raw_node_ref
|
|||||||
else // normal case...
|
else // normal case...
|
||||||
tn->fn->size = je32_to_cpu(rd->dsize);
|
tn->fn->size = je32_to_cpu(rd->dsize);
|
||||||
|
|
||||||
JFFS2_DBG_READINODE("dnode @%08x: ver %u, offset %#04x, dsize %#04x\n",
|
JFFS2_DBG_READINODE("dnode @%08x: ver %u, offset %#04x, dsize %#04x, csize %#04x\n",
|
||||||
ref_offset(ref), je32_to_cpu(rd->version), je32_to_cpu(rd->offset), je32_to_cpu(rd->dsize));
|
ref_offset(ref), je32_to_cpu(rd->version), je32_to_cpu(rd->offset), je32_to_cpu(rd->dsize), csize);
|
||||||
|
|
||||||
jffs2_add_tn_to_tree(tn, tnp);
|
jffs2_add_tn_to_tree(tn, tnp);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user