summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChunrong Guo <B40290@freescale.com>2013-08-15 17:59:55 +0800
committerSaul Wold <sgw@linux.intel.com>2013-08-20 07:11:44 -0700
commitd98f08a7ad95d0b17846276b028a6614f16b6846 (patch)
treeced2c1cb94c4246327fa7b93124fc893a96050d3
parent0ec3710b8dcae311e8d9d676d5f1c6843a81383b (diff)
downloadopenembedded-core-d98f08a7ad95d0b17846276b028a6614f16b6846.tar.gz
openembedded-core-d98f08a7ad95d0b17846276b028a6614f16b6846.tar.bz2
openembedded-core-d98f08a7ad95d0b17846276b028a6614f16b6846.zip
genext2fs: fix memory corruption on powerpc
* fix memory corruption errors on powerpc64 e.g. |$ genext2fs -b 30000 -d . -i 8192 /tmp/tstrootfs | Segmentation fault Signed-off-by: Chunrong Guo <B40290@freescale.com> Signed-off-by: Saul Wold <sgw@linux.intel.com>
-rw-r--r--meta/recipes-devtools/genext2fs/genext2fs-1.4.1/fix-memory-corruption-on-powerpc.patch76
-rw-r--r--meta/recipes-devtools/genext2fs/genext2fs_1.4.1.bb3
2 files changed, 78 insertions, 1 deletions
diff --git a/meta/recipes-devtools/genext2fs/genext2fs-1.4.1/fix-memory-corruption-on-powerpc.patch b/meta/recipes-devtools/genext2fs/genext2fs-1.4.1/fix-memory-corruption-on-powerpc.patch
new file mode 100644
index 0000000000..0ef162c023
--- /dev/null
+++ b/meta/recipes-devtools/genext2fs/genext2fs-1.4.1/fix-memory-corruption-on-powerpc.patch
@@ -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;
diff --git a/meta/recipes-devtools/genext2fs/genext2fs_1.4.1.bb b/meta/recipes-devtools/genext2fs/genext2fs_1.4.1.bb
index 702245ff75..60fd0c223d 100644
--- a/meta/recipes-devtools/genext2fs/genext2fs_1.4.1.bb
+++ b/meta/recipes-devtools/genext2fs/genext2fs_1.4.1.bb
@@ -22,7 +22,8 @@ SRC_URI += "file://update_to_1.95.patch \
file://0017-Fix-file-same-comparison.patch \
file://0018-Handle-files-changing-while-we-are-working.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[sha256sum] = "404dbbfa7a86a6c3de8225c8da254d026b17fd288e05cec4df2cc7e1f4feecfc"