ext4: Do not crash when trying to grow a directory using extents
authorStefan Brüns <stefan.bruens@rwth-aachen.de>
Tue, 6 Sep 2016 02:36:43 +0000 (04:36 +0200)
committerTom Rini <trini@konsulko.com>
Fri, 23 Sep 2016 13:02:36 +0000 (09:02 -0400)
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>
fs/ext4/ext4_common.c

index 680e0011ccf6fdc23cfd038b626dbc17d35886f8..eebca7de91d11dce6d97e77639ad5008b62f5e16 100644 (file)
@@ -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;