[U-Boot] [PATCH 3/3] 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 --- fs/ext4/ext4_common.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c index b8c37cf..6432104 100644 --- a/fs/ext4/ext4_common.c +++ b/fs/ext4/ext4_common.c @@ -431,8 +431,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;

Hi Stefan,
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
fs/ext4/ext4_common.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c index b8c37cf..6432104 100644 --- a/fs/ext4/ext4_common.c +++ b/fs/ext4/ext4_common.c @@ -431,8 +431,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;
Reviewed-by: Lukasz Majewski l.majewski@samsung.com
participants (2)
-
Lukasz Majewski
-
Stefan Brüns