From: Eryu Guan <guaneryu@gmail.com>
To: "Darrick J. Wong" <darrick.wong@oracle.com>
Cc: fstests@vger.kernel.org
Subject: Re: [PATCH] xfs: make sure the kernel and repair tools catch bad names
Date: Mon, 4 Nov 2019 00:15:59 +0800 [thread overview]
Message-ID: <20191103161540.GB8664@desktop> (raw)
In-Reply-To: <20191029222948.GA15224@magnolia>
On Tue, Oct 29, 2019 at 03:29:48PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
>
> Make sure we actually catch bad names in the kernel.
>
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
> tests/xfs/749 | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> tests/xfs/749.out | 50 +++++++++++++++++++
> tests/xfs/group | 1
> 3 files changed, 188 insertions(+)
> create mode 100755 tests/xfs/749
> create mode 100644 tests/xfs/749.out
>
> diff --git a/tests/xfs/749 b/tests/xfs/749
> new file mode 100755
> index 00000000..a8353cc2
> --- /dev/null
> +++ b/tests/xfs/749
> @@ -0,0 +1,137 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0-or-newer
> +# Copyright (c) 2019, Oracle and/or its affiliates. All Rights Reserved.
> +#
> +# FS QA Test No. 749
> +#
> +# See if we catch corrupt directory names or attr names with nulls or slashes
> +# in them.
> +
> +seq=`basename $0`
> +seqres=$RESULT_DIR/$seq
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +tmp=/tmp/$$
> +status=1 # failure is the default!
> +trap "_cleanup; exit \$status" 0 1 2 3 15
> +
> +_cleanup()
> +{
> + cd /
> + $UMOUNT_PROG $mntpt > /dev/null 2>&1
> + test -n "$loopdev" && _destroy_loop_device $loopdev > /dev/null 2>&1
> + rm -r -f $imgfile $mntpt $tmp.*
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +. ./common/attr
> +
> +# real QA test starts here
> +_supported_fs xfs
> +_supported_os Linux
> +_require_test
> +_require_attrs
> +_require_xfs_mkfs_crc
> +_disable_dmesg_check
> +
> +rm -f $seqres.full
> +
> +imgfile=$TEST_DIR/img-$seq
> +mntpt=$TEST_DIR/mount-$seq
> +testdir=$mntpt/testdir
> +testfile=$mntpt/testfile
> +nullstr="too_many_beans"
> +slashstr="are_bad_for_you"
> +test_names=("something" "$nullstr" "$slashstr" "another")
> +
> +# Format image file w/o crcs so we can sed the image file
> +$XFS_IO_PROG -f -c 'truncate 40m' $imgfile
> +loopdev=$(_create_loop_device $imgfile)
> +MKFS_OPTIONS="-m crc=0" _mkfs_dev $loopdev >> $seqres.full
I see the following failures after forcing it crc=0 with v5.4-rc4
kernel, just want to make sure if that's all expected?
attr_get: No data available
Could not get "a_are_bad/for_you" for TEST_DIR/mount-148/testfile
++ ACCESSING BAD METADATA
-ls: reading directory 'TEST_DIR/mount-148/testdir': Structure needs cleaning
+ls: reading directory 'TEST_DIR/mount-148/testdir': Input/output error
f_something
-attr_list: Structure needs cleaning
+f_too_many
+Attribute "a_something" has a 3 byte value for TEST_DIR/mount-148/testfile
+Attribute "a_are_bad/for_you" has a 3 byte value for TEST_DIR/mount-148/testfile
+Attribute "a_another" has a 3 byte value for TEST_DIR/mount-148/testfile
TEST_DIR/mount-148/testdir/f_something
Attribute "a_something" had a 3 byte value for TEST_DIR/mount-148/testfile:
heh
Thanks,
Eryu
> +
> +# Mount image file
> +mkdir -p $mntpt
> +_mount $loopdev $mntpt
> +
> +echo "creating entries" >> $seqres.full
> +
> +# Create directory entries
> +mkdir -p $testdir
> +for name in "${test_names[@]}"; do
> + touch "$testdir/f_$name"
> +done
> +
> +# Create attrs
> +touch $testfile
> +for name in "${test_names[@]}"; do
> + $ATTR_PROG -s "a_$name" -V heh $testfile >> $seqres.full
> +done
> +
> +# Now put in the first part of the garbage names to make sure we can't
> +# access those directly
> +test_names+=("too_many" "are_bad/for_you")
> +
> +access_stuff() {
> + ls $testdir
> + $ATTR_PROG -l $testfile
> +
> + for name in "${test_names[@]}"; do
> + ls "$testdir/f_$name"
> + $ATTR_PROG -g "a_$name" $testfile
> + done
> +}
> +
> +# Does it work?
> +echo "++ ACCESSING GOOD METADATA" | tee -a $seqres.full
> +access_stuff > $tmp.log 2>&1
> +cat $tmp.log >> $seqres.full
> +cat $tmp.log | _filter_test_dir
> +
> +# Corrupt the entries
> +$UMOUNT_PROG $mntpt
> +_destroy_loop_device $loopdev
> +cp $imgfile $imgfile.old
> +sed -b \
> + -e "s/$nullstr/too_many\x00beans/g" \
> + -e "s/$slashstr/are_bad\/for_you/g" \
> + -i $imgfile
> +test "$(md5sum < $imgfile)" != "$(md5sum < $imgfile.old)" ||
> + _fail "sed failed to change the image file?"
> +rm -f $imgfile.old
> +loopdev=$(_create_loop_device $imgfile)
> +_mount $loopdev $mntpt
> +
> +# Try to access the corrupt metadata
> +echo "++ ACCESSING BAD METADATA" | tee -a $seqres.full
> +access_stuff > $tmp.log 2>&1
> +cat $tmp.log >> $seqres.full
> +cat $tmp.log | _filter_test_dir | sed -e '/Could not list/d'
> +
> +echo "does scrub complain?" >> $seqres.full
> +
> +# Does scrub complain about this?
> +if _supports_xfs_scrub $mntpt $loopdev; then
> + $XFS_SCRUB_PROG -n $mntpt >> $seqres.full 2>&1
> + res=$?
> + test $((res & 1)) -eq 0 && \
> + echo "scrub failed to report corruption ($res)"
> +fi
> +
> +echo "does repair complain?" >> $seqres.full
> +
> +# Does repair complain about this?
> +$UMOUNT_PROG $mntpt
> +$XFS_REPAIR_PROG -n $loopdev >> $seqres.full 2>&1
> +res=$?
> +test $res -eq 1 || \
> + echo "repair failed to report corruption ($res)"
> +
> +_destroy_loop_device $loopdev
> +loopdev=
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/xfs/749.out b/tests/xfs/749.out
> new file mode 100644
> index 00000000..ab7b7dc6
> --- /dev/null
> +++ b/tests/xfs/749.out
> @@ -0,0 +1,50 @@
> +QA output created by 749
> +++ ACCESSING GOOD METADATA
> +f_another
> +f_are_bad_for_you
> +f_something
> +f_too_many_beans
> +Attribute "a_something" has a 3 byte value for TEST_DIR/mount-749/testfile
> +Attribute "a_too_many_beans" has a 3 byte value for TEST_DIR/mount-749/testfile
> +Attribute "a_are_bad_for_you" has a 3 byte value for TEST_DIR/mount-749/testfile
> +Attribute "a_another" has a 3 byte value for TEST_DIR/mount-749/testfile
> +TEST_DIR/mount-749/testdir/f_something
> +Attribute "a_something" had a 3 byte value for TEST_DIR/mount-749/testfile:
> +heh
> +TEST_DIR/mount-749/testdir/f_too_many_beans
> +Attribute "a_too_many_beans" had a 3 byte value for TEST_DIR/mount-749/testfile:
> +heh
> +TEST_DIR/mount-749/testdir/f_are_bad_for_you
> +Attribute "a_are_bad_for_you" had a 3 byte value for TEST_DIR/mount-749/testfile:
> +heh
> +TEST_DIR/mount-749/testdir/f_another
> +Attribute "a_another" had a 3 byte value for TEST_DIR/mount-749/testfile:
> +heh
> +ls: cannot access 'TEST_DIR/mount-749/testdir/f_too_many': No such file or directory
> +attr_get: No data available
> +Could not get "a_too_many" for TEST_DIR/mount-749/testfile
> +ls: cannot access 'TEST_DIR/mount-749/testdir/f_are_bad/for_you': No such file or directory
> +attr_get: No data available
> +Could not get "a_are_bad/for_you" for TEST_DIR/mount-749/testfile
> +++ ACCESSING BAD METADATA
> +ls: reading directory 'TEST_DIR/mount-749/testdir': Structure needs cleaning
> +f_something
> +attr_list: Structure needs cleaning
> +TEST_DIR/mount-749/testdir/f_something
> +Attribute "a_something" had a 3 byte value for TEST_DIR/mount-749/testfile:
> +heh
> +ls: cannot access 'TEST_DIR/mount-749/testdir/f_too_many_beans': No such file or directory
> +attr_get: No data available
> +Could not get "a_too_many_beans" for TEST_DIR/mount-749/testfile
> +ls: cannot access 'TEST_DIR/mount-749/testdir/f_are_bad_for_you': No such file or directory
> +attr_get: No data available
> +Could not get "a_are_bad_for_you" for TEST_DIR/mount-749/testfile
> +TEST_DIR/mount-749/testdir/f_another
> +Attribute "a_another" had a 3 byte value for TEST_DIR/mount-749/testfile:
> +heh
> +ls: cannot access 'TEST_DIR/mount-749/testdir/f_too_many': No such file or directory
> +attr_get: No data available
> +Could not get "a_too_many" for TEST_DIR/mount-749/testfile
> +ls: cannot access 'TEST_DIR/mount-749/testdir/f_are_bad/for_you': No such file or directory
> +Attribute "a_are_bad/for_you" had a 3 byte value for TEST_DIR/mount-749/testfile:
> +heh
> diff --git a/tests/xfs/group b/tests/xfs/group
> index f4ebcd8c..9600cb4e 100644
> --- a/tests/xfs/group
> +++ b/tests/xfs/group
> @@ -507,3 +507,4 @@
> 509 auto ioctl
> 510 auto ioctl quick
> 511 auto quick quota
> +749 auto quick fuzzers
next prev parent reply other threads:[~2019-11-03 16:16 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-29 22:29 [PATCH] xfs: make sure the kernel and repair tools catch bad names Darrick J. Wong
2019-11-03 16:15 ` Eryu Guan [this message]
2019-11-03 18:52 ` Darrick J. Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191103161540.GB8664@desktop \
--to=guaneryu@gmail.com \
--cc=darrick.wong@oracle.com \
--cc=fstests@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.