]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
tests: test e2fsck's handling of bad symlinks
authorEric Biggers <ebiggers@google.com>
Sat, 3 Mar 2018 00:59:23 +0000 (16:59 -0800)
committerTheodore Ts'o <tytso@mit.edu>
Sun, 4 Mar 2018 04:21:57 +0000 (23:21 -0500)
Add a test which verifies that e2fsck will detect a variety of bad
symlinks, both fast and slow, and with several combinations of
filesystem features including extents, encryption, and inline_data.
There was already a similar test (f_badsymlinks), but it's an old test
that doesn't use any of these newer filesystem features.

Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
tests/f_badsymlinks2/expect.1 [new file with mode: 0644]
tests/f_badsymlinks2/expect.2 [new file with mode: 0644]
tests/f_badsymlinks2/image.gz [new file with mode: 0644]
tests/f_badsymlinks2/mkimage.sh [new file with mode: 0755]
tests/f_badsymlinks2/name [new file with mode: 0644]

diff --git a/tests/f_badsymlinks2/expect.1 b/tests/f_badsymlinks2/expect.1
new file mode 100644 (file)
index 0000000..939edce
--- /dev/null
@@ -0,0 +1,114 @@
+Pass 1: Checking inodes, blocks, and sizes
+Pass 2: Checking directory structure
+Symlink /default/empty (inode #13) is invalid.
+Clear? yes
+
+Symlink /default/fast_isize_too_small (inode #15) is invalid.
+Clear? yes
+
+Symlink /default/fast_isize_too_large (inode #16) is invalid.
+Clear? yes
+
+Symlink /default/slow_isize_too_small (inode #19) is invalid.
+Clear? yes
+
+Symlink /default/slow_isize_too_large (inode #20) is invalid.
+Clear? yes
+
+Symlink /default/one_too_long (inode #22) is invalid.
+Clear? yes
+
+Symlink /default/too_long (inode #23) is invalid.
+Clear? yes
+
+Symlink /encrypted/empty (inode #25) is invalid.
+Clear? yes
+
+Symlink /encrypted/fast_isize_too_large (inode #28) is invalid.
+Clear? yes
+
+Symlink /encrypted/fast_isize_too_small (inode #27) is invalid.
+Clear? yes
+
+Symlink /encrypted/one_too_long (inode #34) is invalid.
+Clear? yes
+
+Symlink /encrypted/slow_isize_too_large (inode #32) is invalid.
+Clear? yes
+
+Symlink /encrypted/slow_isize_too_small (inode #31) is invalid.
+Clear? yes
+
+Symlink /encrypted/too_long (inode #35) is invalid.
+Clear? yes
+
+Symlink /extents/empty (inode #38) is invalid.
+Clear? yes
+
+Symlink /extents/fast_isize_too_small (inode #40) is invalid.
+Clear? yes
+
+Symlink /extents/fast_isize_too_large (inode #41) is invalid.
+Clear? yes
+
+Symlink /extents/slow_isize_too_small (inode #44) is invalid.
+Clear? yes
+
+Symlink /extents/slow_isize_too_large (inode #45) is invalid.
+Clear? yes
+
+Symlink /extents/one_too_long (inode #47) is invalid.
+Clear? yes
+
+Symlink /extents/too_long (inode #48) is invalid.
+Clear? yes
+
+Symlink /extents_encrypted/empty (inode #50) is invalid.
+Clear? yes
+
+Symlink /extents_encrypted/fast_isize_too_large (inode #53) is invalid.
+Clear? yes
+
+Symlink /extents_encrypted/fast_isize_too_small (inode #52) is invalid.
+Clear? yes
+
+Symlink /extents_encrypted/one_too_long (inode #59) is invalid.
+Clear? yes
+
+Symlink /extents_encrypted/slow_isize_too_large (inode #57) is invalid.
+Clear? yes
+
+Symlink /extents_encrypted/slow_isize_too_small (inode #56) is invalid.
+Clear? yes
+
+Symlink /extents_encrypted/too_long (inode #60) is invalid.
+Clear? yes
+
+Symlink /inline_data/empty (inode #63) is invalid.
+Clear? yes
+
+Symlink /inline_data/fast_isize_too_small (inode #65) is invalid.
+Clear? yes
+
+Symlink /inline_data/fast_isize_too_large (inode #66) is invalid.
+Clear? yes
+
+Symlink /inline_data/slow_isize_too_small (inode #69) is invalid.
+Clear? yes
+
+Symlink /inline_data/slow_isize_too_large (inode #70) is invalid.
+Clear? yes
+
+Symlink /inline_data/one_too_long (inode #72) is invalid.
+Clear? yes
+
+Symlink /inline_data/too_long (inode #73) is invalid.
+Clear? 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: 36/80 files (0.0% non-contiguous), 31/150 blocks
+Exit status is 1
diff --git a/tests/f_badsymlinks2/expect.2 b/tests/f_badsymlinks2/expect.2
new file mode 100644 (file)
index 0000000..3da98a8
--- /dev/null
@@ -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: 36/80 files (0.0% non-contiguous), 31/150 blocks
+Exit status is 0
diff --git a/tests/f_badsymlinks2/image.gz b/tests/f_badsymlinks2/image.gz
new file mode 100644 (file)
index 0000000..d1f314c
Binary files /dev/null and b/tests/f_badsymlinks2/image.gz differ
diff --git a/tests/f_badsymlinks2/mkimage.sh b/tests/f_badsymlinks2/mkimage.sh
new file mode 100755 (executable)
index 0000000..6bbf020
--- /dev/null
@@ -0,0 +1,127 @@
+#!/bin/bash
+
+# This is the script that was used to create the image.gz in this directory.
+
+set -e -u
+
+BLOCKSIZE=4096
+
+do_debugfs() {
+       umount mnt
+       debugfs -w "$@" image
+       mount image mnt
+}
+
+do_tune2fs() {
+       umount mnt
+       tune2fs $@ image
+       mount image mnt
+}
+
+symlink() {
+       local len=$1
+       local src=$2
+       local target=$(perl -e 'print "A" x '$len)
+       ln -s $target $src
+       stat -c %i $src
+}
+
+# Overwrite the length in the header of the encrypted symlink target
+set_encrypted_symlink_len() {
+       local ino=$1
+       local len=$2
+
+       echo "zap_block -f <$ino> -p $((len%256)) -o 0 -l 1 0"
+       echo "zap_block -f <$ino> -p $((len/256)) -o 1 -l 1 0"
+}
+
+create_symlinks() {
+       local dir=$1
+       local encrypted=${2:-false}
+       local overhead=0
+       local ino
+
+       if $encrypted; then
+               overhead=2
+       fi
+
+       mkdir -p $dir
+
+       {
+       ino=$(symlink 1 $dir/empty)
+       echo "set_inode_field <$ino> i_size 10"
+       echo "set_inode_field <$ino> block[0] 0"
+
+       symlink 1 $dir/fast_min > /dev/null
+
+       ino=$(symlink 10 $dir/fast_isize_too_small)
+       echo "set_inode_field <$ino> i_size 1"
+
+       ino=$(symlink 10 $dir/fast_isize_too_large)
+       echo "set_inode_field <$ino> i_size 20"
+
+       symlink $((59 - overhead)) $dir/fast_max > /dev/null
+
+       symlink $((60 - overhead)) $dir/slow_min > /dev/null
+
+       ino=$(symlink 100 $dir/slow_isize_too_small)
+       echo "set_inode_field <$ino> i_size 80"
+
+       ino=$(symlink 100 $dir/slow_isize_too_large)
+       echo "set_inode_field <$ino> i_size 120"
+
+       symlink $((BLOCKSIZE - 1 - overhead)) $dir/slow_max > /dev/null
+
+       ino=$(symlink $((BLOCKSIZE - 1 - overhead)) $dir/one_too_long)
+       echo "set_inode_field <$ino> i_size $BLOCKSIZE"
+       echo "zap_block -f <$ino> -p 65 0"
+       if $encrypted; then
+               set_encrypted_symlink_len $ino $((BLOCKSIZE - overhead))
+       fi
+
+       ino=$(symlink $((BLOCKSIZE - 1 - overhead)) $dir/too_long)
+       echo "set_inode_field <$ino> i_size $((BLOCKSIZE + 1000))"
+       echo "zap_block -f <$ino> -p 65 0"
+       if $encrypted; then
+               set_encrypted_symlink_len $ino $((BLOCKSIZE + 1000 - overhead))
+       fi
+
+       } >> debugfs_commands
+       do_debugfs < debugfs_commands
+}
+
+create_encrypted_symlinks() {
+       local dir=$1 link
+
+       mkdir $dir
+       echo | e4crypt add_key $dir
+       create_symlinks $dir true
+
+       # Move symlinks into an unencrypted directory (leaving their targets
+       # encrypted).  This makes the fsck output consistent.
+       mv $dir ${dir}~encrypted
+       mkdir $dir
+       mv ${dir}~encrypted/* $dir
+}
+
+mkdir -p mnt
+umount mnt &> /dev/null || true
+dd if=/dev/zero of=image bs=1024 count=600
+
+mke2fs -O 'encrypt,^extents,^64bit' -b $BLOCKSIZE -I 256 image
+mount image mnt
+
+create_symlinks mnt/default
+create_encrypted_symlinks mnt/encrypted
+
+do_tune2fs -O extents
+create_symlinks mnt/extents
+create_encrypted_symlinks mnt/extents_encrypted
+
+do_debugfs -R 'feature inline_data'
+create_symlinks mnt/inline_data
+
+rm -rf debugfs_commands mnt/*~encrypted
+umount mnt
+rmdir mnt
+gzip -9 -f image
diff --git a/tests/f_badsymlinks2/name b/tests/f_badsymlinks2/name
new file mode 100644 (file)
index 0000000..81d3285
--- /dev/null
@@ -0,0 +1 @@
+more types of corrupted symlinks