summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorStefan Brüns <stefan.bruens@rwth-aachen.de>2016-09-06 04:36:43 +0200
committerTom Rini <trini@konsulko.com>2016-09-23 09:02:36 -0400
commitb96c3c7292214fb81b1b355bf5a6d53cf9996d1e (patch)
treec9d7fc6bb70acb33207b3bd5d8929c4ebe9fb689 /fs
parenta0d767e2c1e40e781fdaa592f06f92614b4e5cdf (diff)
downloadu-boot-imx-b96c3c7292214fb81b1b355bf5a6d53cf9996d1e.zip
u-boot-imx-b96c3c7292214fb81b1b355bf5a6d53cf9996d1e.tar.gz
u-boot-imx-b96c3c7292214fb81b1b355bf5a6d53cf9996d1e.tar.bz2
ext4: Do not crash when trying to grow a directory using extents
The following command crashes u-boot: ./sandbox/u-boot -c 'i=0; host bind 0 ./sandbox/test/fs/3GB.ext4.img ; while test $i -lt 200 ; do echo $i; setexpr i $i + 1; ext4write host 0 0 /foobar${i} 0; done' Previously, the code updated the direct_block even for extents, and fortunately crashed before pushing garbage to the disk. Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de> Reviewed-by: Lukasz Majewski <l.majewski@samsung.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/ext4/ext4_common.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c
index 680e001..eebca7d 100644
--- a/fs/ext4/ext4_common.c
+++ b/fs/ext4/ext4_common.c
@@ -453,8 +453,13 @@ restart:
sizeof(struct ext2_dirent) + padding_factor;
if ((fs->blksz - totalbytes - last_entry_dirlen) <
new_entry_byte_reqd) {
- printf("1st Block Full:Allocate new block\n");
+ printf("Last Block Full:Allocate new block\n");
+ if (le32_to_cpu(g_parent_inode->flags) &
+ EXT4_EXTENTS_FL) {
+ printf("Directory uses extents\n");
+ goto fail;
+ }
if (direct_blk_idx == INDIRECT_BLOCKS - 1) {
printf("Directory exceeds limit\n");
goto fail;