diff options
-rw-r--r-- | e2fsck/pass2.c | 9 | ||||
-rw-r--r-- | tests/f_baddir2/expect.1 | 12 | ||||
-rw-r--r-- | tests/f_baddir2/expect.2 | 7 | ||||
-rw-r--r-- | tests/f_baddir2/image.gz | bin | 0 -> 587 bytes | |||
-rw-r--r-- | tests/f_baddir2/name | 1 |
5 files changed, 25 insertions, 4 deletions
diff --git a/e2fsck/pass2.c b/e2fsck/pass2.c index e235348c..5e088e2d 100644 --- a/e2fsck/pass2.c +++ b/e2fsck/pass2.c @@ -675,11 +675,12 @@ static void salvage_directory(ext2_filsys fs, return; } /* - * If the directory entry is a multiple of four, so it is - * valid, let the previous directory entry absorb the invalid - * one. + * If the record length of the directory entry is a multiple + * of four, and not too big, such that it is valid, let the + * previous directory entry absorb the invalid one. */ - if (prev && dirent->rec_len && (dirent->rec_len % 4) == 0) { + if (prev && dirent->rec_len && (dirent->rec_len % 4) == 0 && + (*offset + dirent->rec_len <= fs->blocksize)) { prev->rec_len += dirent->rec_len; *offset += dirent->rec_len; return; diff --git a/tests/f_baddir2/expect.1 b/tests/f_baddir2/expect.1 new file mode 100644 index 00000000..1bfea69d --- /dev/null +++ b/tests/f_baddir2/expect.1 @@ -0,0 +1,12 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Directory inode 12, block 0, offset 60: directory corrupted +Salvage? yes + +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 15/16 files (0.0% non-contiguous), 23/100 blocks +Exit status is 1 diff --git a/tests/f_baddir2/expect.2 b/tests/f_baddir2/expect.2 new file mode 100644 index 00000000..b85bbabf --- /dev/null +++ b/tests/f_baddir2/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 15/16 files (0.0% non-contiguous), 23/100 blocks +Exit status is 0 diff --git a/tests/f_baddir2/image.gz b/tests/f_baddir2/image.gz Binary files differnew file mode 100644 index 00000000..0d9fcdf7 --- /dev/null +++ b/tests/f_baddir2/image.gz diff --git a/tests/f_baddir2/name b/tests/f_baddir2/name new file mode 100644 index 00000000..568a7c96 --- /dev/null +++ b/tests/f_baddir2/name @@ -0,0 +1 @@ +salvage last directory entry |