genext2fs: fix memory corruption on powerpc
* fix memory corruption errors on powerpc64 e.g. |$ genext2fs -b 30000 -d . -i 8192 /tmp/tstrootfs | Segmentation fault (From OE-Core rev: d98f08a7ad95d0b17846276b028a6614f16b6846) Signed-off-by: Chunrong Guo <B40290@freescale.com> Signed-off-by: Saul Wold <sgw@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
parent
3c1f166ce5
commit
fe227a023e
|
@ -0,0 +1,76 @@
|
||||||
|
Upstream-Status: Submitted
|
||||||
|
|
||||||
|
fix memory corruption on powerpc
|
||||||
|
|
||||||
|
Signed-off-by: Wrobel Heinz <Heinz.Wrobel@freescale.com>
|
||||||
|
|
||||||
|
diff --unified a/genext2fs.c b/genext2fs.c
|
||||||
|
--- a/genext2fs.c 2013-08-14 16:50:59.061623605 +0200
|
||||||
|
+++ b/genext2fs.c 2013-08-14 16:47:23.349623674 +0200
|
||||||
|
@@ -675,21 +675,34 @@
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
-swap_nod(inode *nod)
|
||||||
|
+swap_nod(inode *nod, int fromdisk)
|
||||||
|
{
|
||||||
|
uint32 nblk;
|
||||||
|
+ uint32 i_blocks = nod->i_blocks;
|
||||||
|
+ uint32 i_size = nod->i_size;
|
||||||
|
+ uint16 i_mode = nod->i_mode;
|
||||||
|
+
|
||||||
|
|
||||||
|
#define this nod
|
||||||
|
inode_decl
|
||||||
|
#undef this
|
||||||
|
|
||||||
|
+ if (fromdisk) {
|
||||||
|
+ // Only now do we have the values in the correct
|
||||||
|
+ // endianess for the host. So we override the
|
||||||
|
+ // earlier assumption
|
||||||
|
+ i_blocks = nod->i_blocks;
|
||||||
|
+ i_size = nod->i_size;
|
||||||
|
+ i_mode = nod->i_mode;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
// block and character inodes store the major and minor in the
|
||||||
|
// i_block, so we need to unswap to get those. Also, if it's
|
||||||
|
// zero iblocks, put the data back like it belongs.
|
||||||
|
- nblk = nod->i_blocks / INOBLK;
|
||||||
|
- if ((nod->i_size && !nblk)
|
||||||
|
- || ((nod->i_mode & FM_IFBLK) == FM_IFBLK)
|
||||||
|
- || ((nod->i_mode & FM_IFCHR) == FM_IFCHR))
|
||||||
|
+ nblk = i_blocks / INOBLK;
|
||||||
|
+ if ((i_size && !nblk)
|
||||||
|
+ || ((i_mode & FM_IFBLK) == FM_IFBLK)
|
||||||
|
+ || ((i_mode & FM_IFCHR) == FM_IFCHR))
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for(i = 0; i <= EXT2_TIND_BLOCK; i++)
|
||||||
|
@@ -1066,7 +1079,7 @@
|
||||||
|
nod_info *ni = container_of(elem, nod_info, link);
|
||||||
|
|
||||||
|
if (ni->fs->swapit)
|
||||||
|
- swap_nod(ni->itab);
|
||||||
|
+ swap_nod(ni->itab, 0);
|
||||||
|
put_blk(ni->bi);
|
||||||
|
free(ni);
|
||||||
|
}
|
||||||
|
@@ -1102,7 +1115,7 @@
|
||||||
|
ni->b = get_blk(fs, fs->gd[grp].bg_inode_table + boffset, &ni->bi);
|
||||||
|
ni->itab = ((inode *) ni->b) + offset;
|
||||||
|
if (fs->swapit)
|
||||||
|
- swap_nod(ni->itab);
|
||||||
|
+ swap_nod(ni->itab, 1);
|
||||||
|
|
||||||
|
out:
|
||||||
|
*rni = ni;
|
||||||
|
@@ -1158,6 +1171,8 @@
|
||||||
|
if (dw->fs->swapit)
|
||||||
|
swap_dir(&dw->d);
|
||||||
|
memcpy(dw->last_d, &dw->d, sizeof(directory));
|
||||||
|
+ if (dw->fs->swapit)
|
||||||
|
+ swap_dir(&dw->d);
|
||||||
|
|
||||||
|
if (((int8 *) next_d) >= ((int8 *) dw->b + BLOCKSIZE))
|
||||||
|
return NULL;
|
|
@ -22,7 +22,8 @@ SRC_URI += "file://update_to_1.95.patch \
|
||||||
file://0017-Fix-file-same-comparison.patch \
|
file://0017-Fix-file-same-comparison.patch \
|
||||||
file://0018-Handle-files-changing-while-we-are-working.patch \
|
file://0018-Handle-files-changing-while-we-are-working.patch \
|
||||||
file://0019-Make-sure-superblock-is-clear-on-allocation.patch \
|
file://0019-Make-sure-superblock-is-clear-on-allocation.patch \
|
||||||
file://fix-nbblocks-cast.patch"
|
file://fix-nbblocks-cast.patch \
|
||||||
|
file://fix-memory-corruption-on-powerpc.patch "
|
||||||
|
|
||||||
SRC_URI[md5sum] = "b7b6361bcce2cedff1ae437fadafe53b"
|
SRC_URI[md5sum] = "b7b6361bcce2cedff1ae437fadafe53b"
|
||||||
SRC_URI[sha256sum] = "404dbbfa7a86a6c3de8225c8da254d026b17fd288e05cec4df2cc7e1f4feecfc"
|
SRC_URI[sha256sum] = "404dbbfa7a86a6c3de8225c8da254d026b17fd288e05cec4df2cc7e1f4feecfc"
|
||||||
|
|
Loading…
Reference in New Issue