From: Darrick J. Wong Date: Sun, 10 Aug 2014 22:50:38 +0000 (-0400) Subject: e2fsck: don't set prev after processing '..' on an inline dir X-Git-Tag: v1.43-WIP-2015-05-18~226 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6698374cc0a0d99c954aa61db771ba4128432337;p=thirdparty%2Fe2fsprogs.git e2fsck: don't set prev after processing '..' on an inline dir In an inline directory, the '..' entry is compacted down to just the inode number; there is no full '..' entry. Therefore, it makes no sense to assign 'prev' to the fake dotdot entry we put on the stack, as this could confuse a salvage_directory call on a corrupted next entry into modifying stack contents (the fake dotdot entry). Signed-off-by: Darrick J. Wong Signed-off-by: Theodore Ts'o --- diff --git a/e2fsck/pass2.c b/e2fsck/pass2.c index ed2c4d790..fb98af5d3 100644 --- a/e2fsck/pass2.c +++ b/e2fsck/pass2.c @@ -1330,8 +1330,19 @@ skip_checksum: if (!inline_data_size || dot_state > 1) { offset += rec_len; } else { - if (dot_state == 1) + if (dot_state == 1) { offset = 4; + /* + * If we get here, we're checking an inline + * directory and we've just checked a (fake) + * dotdot entry that we created on the stack. + * Therefore set 'prev' to NULL so that if we + * call salvage_directory on the next entry, + * it won't try to absorb the next entry into + * the on-stack dotdot entry. + */ + prev = NULL; + } } dot_state++; } while (is_last_entry(fs, inline_data_size, offset, de_csum_size));