diff options
author | Thomas Fitzsimmons <fitzsim@cisco.com> | 2015-11-18 12:42:53 -0500 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2015-11-23 11:01:52 -0500 |
commit | 54d68e9333ff65d135faac68fa01be4276f1371f (patch) | |
tree | aaf2d56aa76f2b1b3a4566ca60d4e054237ff3f1 /fs/ext4/ext4_common.c | |
parent | b4bd6554937ca5c13786b6725e122839f5ebe4f7 (diff) |
fs: ext4: Prevent infinite loop in ext4fs_iterate_dir
If the ext3 journal gets out of sync with what is written on disk, for
example because of an unexpected power cut, ext4fs_read_file can
return an all-zero directory entry. In that case, ext4fs_iterate_dir
would infinite loop.
This patch detects when a directory entry's direntlen member is 0 and
returns a failure status, which breaks out of the infinite loop. As a
result, U-Boot will not find files that may subsequently be recovered
when the journal is replayed.
This is better behaviour than hanging in an infinite loop, but as a
further improvement maybe U-Boot could interpret the ext3 journal and
actually find the unsynced entries.
Signed-off-by: Thomas Fitzsimmons <fitzsim@cisco.com>
Reviewed-by: Stefan Roese <sr@denx.de>
Diffstat (limited to 'fs/ext4/ext4_common.c')
-rw-r--r-- | fs/ext4/ext4_common.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c index 727a2f753df..e73223ac22c 100644 --- a/fs/ext4/ext4_common.c +++ b/fs/ext4/ext4_common.c @@ -1920,6 +1920,11 @@ int ext4fs_iterate_dir(struct ext2fs_node *dir, char *name, if (status < 0) return 0; + if (dirent.direntlen == 0) { + printf("Failed to iterate over directory %s\n", name); + return 0; + } + if (dirent.namelen != 0) { char filename[dirent.namelen + 1]; struct ext2fs_node *fdiro; |