summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--e2fsck/pass2.c9
-rw-r--r--tests/f_baddir2/expect.112
-rw-r--r--tests/f_baddir2/expect.27
-rw-r--r--tests/f_baddir2/image.gzbin0 -> 587 bytes
-rw-r--r--tests/f_baddir2/name1
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
new file mode 100644
index 00000000..0d9fcdf7
--- /dev/null
+++ b/tests/f_baddir2/image.gz
Binary files differ
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