mirror of
https://xff.cz/git/u-boot/
synced 2025-09-01 16:52:14 +02:00
ext4: fix possible crash on directory traversal, ignore deleted entries
The following command triggers a segfault in search_dir: ./sandbox/u-boot -c 'host bind 0 ./sandbox/test/fs/3GB.ext4.img ; ext4write host 0 0 /./foo 0x10' The following command triggers a segfault in check_filename: ./sandbox/u-boot -c 'host bind 0 ./sandbox/test/fs/3GB.ext4.img ; ext4write host 0 0 /. 0x10' "." is the first entry in the directory, thus previous_dir is NULL. The whole previous_dir block in search_dir seems to be a bad copy from check_filename(...). As the changed data is not written to disk, the statement is mostly harmless, save the possible NULL-ptr reference. Typically a file is unlinked by extending the direntlen of the previous entry. If the entry is the first entry in the directory block, it is invalidated by setting inode=0. The inode==0 case is hard to trigger without crafted filesystems. It only hits if the first entry in a directory block is deleted and later a lookup for the entry (by name) is done. Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de> Reviewed-by: Lukasz Majewski <l.majewski@samsung.com>
This commit is contained in:
@@ -882,7 +882,7 @@ int ext4fs_write(const char *fname, unsigned char *buffer,
|
||||
if (ext4fs_iget(parent_inodeno, g_parent_inode))
|
||||
goto fail;
|
||||
/* check if the filename is already present in root */
|
||||
existing_file_inodeno = ext4fs_filename_check(filename);
|
||||
existing_file_inodeno = ext4fs_filename_unlink(filename);
|
||||
if (existing_file_inodeno != -1) {
|
||||
ret = ext4fs_delete_file(existing_file_inodeno);
|
||||
fs->first_pass_bbmap = 0;
|
||||
|
Reference in New Issue
Block a user