fstests: add a filter for the new getcap output

Starting with version 2.41 of libcap, the output of the getcap program
changed and therefore some existing tests fail when the installed version
of libcap is >= 2.41 (the latest version available at the moment is 2.44).

The change was made by the following commit of libcap:

  commit 177cd418031b1acfcf73fe3b1af9f3279828681c
  Author: Andrew G. Morgan <morgan@kernel.org>
  Date:   Tue Jul 21 22:58:05 2020 -0700

      A more compact form for the text representation of capabilities.

      While this does not change anything about the supported range of
      equivalent text specifications for capabilities, as accepted by
      cap_from_text(), this does alter the preferred output format of
      cap_to_text() to be two characters shorter in most cases. That is,
      what used to be summarized as:

         "= cap_foo+..."

      is now converted to the equivalent text:

         "cap_foo=..."

      which is also more intuitive.

So add a filter to change the old format to the new one, an helper that
calls getcap with that filter, make existing tests use the new helper and
update their golden output to match the new output format of getcap.

Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
This commit is contained in:
Filipe Manana
2020-10-11 13:38:52 +01:00
committed by Eryu Guan
parent ab3df57e86
commit 2b5cf241ec
10 changed files with 55 additions and 21 deletions
+28
View File
@@ -603,5 +603,33 @@ _filter_assert_dmesg()
-e "s#$warn2#Intentional warnings in assfail#" -e "s#$warn2#Intentional warnings in assfail#"
} }
# With version 2.41 of libcap, the output format of getcap changed.
# More specifically such change was added by the following commit:
#
# commit 177cd418031b1acfcf73fe3b1af9f3279828681c
# Author: Andrew G. Morgan <morgan@kernel.org>
# Date: Tue Jul 21 22:58:05 2020 -0700
#
# A more compact form for the text representation of capabilities.
#
# While this does not change anything about the supported range of
# equivalent text specifications for capabilities, as accepted by
# cap_from_text(), this does alter the preferred output format of
# cap_to_text() to be two characters shorter in most cases. That is,
# what used to be summarized as:
#
# "= cap_foo+..."
#
# is now converted to the equivalent text:
#
# "cap_foo=..."
#
# which is also more intuitive.
#
_filter_getcap()
{
sed -e "s/= //" -e "s/\+/=/g"
}
# make sure this script returns success # make sure this script returns success
/bin/true /bin/true
+6
View File
@@ -4315,6 +4315,12 @@ _require_mknod()
rm -f $TEST_DIR/$seq.null rm -f $TEST_DIR/$seq.null
} }
_getcap()
{
$GETCAP_PROG "$@" | _filter_getcap
return ${PIPESTATUS[0]}
}
init_rc init_rc
################################################################################ ################################################################################
+8 -8
View File
@@ -43,7 +43,7 @@ check_capabilities()
local ret local ret
file="$1" file="$1"
cap="$2" cap="$2"
ret=$($GETCAP_PROG "$file") ret=$(_getcap "$file")
if [ -z "$ret" ]; then if [ -z "$ret" ]; then
echo "$ret" echo "$ret"
echo "missing capability in file $file" echo "missing capability in file $file"
@@ -74,7 +74,7 @@ full_nocap_inc_withcap_send()
$BTRFS_UTIL_PROG subvolume snapshot -r "$FS1" "$FS1/snap_init" >/dev/null $BTRFS_UTIL_PROG subvolume snapshot -r "$FS1" "$FS1/snap_init" >/dev/null
$BTRFS_UTIL_PROG send "$FS1/snap_init" -q | $BTRFS_UTIL_PROG receive "$FS2" -q $BTRFS_UTIL_PROG send "$FS1/snap_init" -q | $BTRFS_UTIL_PROG receive "$FS2" -q
# ensure that we don't have capabilities set # ensure that we don't have capabilities set
ret=$($GETCAP_PROG "$FS2/snap_init/foo.bar") ret=$(_getcap "$FS2/snap_init/foo.bar")
if [ -n "$ret" ]; then if [ -n "$ret" ]; then
echo "File contains capabilities when it shouldn't" echo "File contains capabilities when it shouldn't"
fi fi
@@ -84,7 +84,7 @@ full_nocap_inc_withcap_send()
$BTRFS_UTIL_PROG subvolume snapshot -r "$FS1" "$FS1/snap_inc" >/dev/null $BTRFS_UTIL_PROG subvolume snapshot -r "$FS1" "$FS1/snap_inc" >/dev/null
$BTRFS_UTIL_PROG send -p "$FS1/snap_init" "$FS1/snap_inc" -q | \ $BTRFS_UTIL_PROG send -p "$FS1/snap_init" "$FS1/snap_inc" -q | \
$BTRFS_UTIL_PROG receive "$FS2" -q $BTRFS_UTIL_PROG receive "$FS2" -q
check_capabilities "$FS2/snap_inc/foo.bar" "cap_sys_ptrace,cap_sys_nice+ep" check_capabilities "$FS2/snap_inc/foo.bar" "cap_sys_ptrace,cap_sys_nice=ep"
_scratch_unmount _scratch_unmount
} }
@@ -107,25 +107,25 @@ roundtrip_send()
$SETCAP_PROG "cap_sys_ptrace+ep cap_sys_nice+ep" "$FS1/foo.bar" $SETCAP_PROG "cap_sys_ptrace+ep cap_sys_nice+ep" "$FS1/foo.bar"
$BTRFS_UTIL_PROG subvolume snapshot -r "$FS1" "$FS1/snap_init" >/dev/null $BTRFS_UTIL_PROG subvolume snapshot -r "$FS1" "$FS1/snap_init" >/dev/null
$BTRFS_UTIL_PROG send "$FS1/snap_init" -q | $BTRFS_UTIL_PROG receive "$FS2" -q $BTRFS_UTIL_PROG send "$FS1/snap_init" -q | $BTRFS_UTIL_PROG receive "$FS2" -q
check_capabilities "$FS2/snap_init/foo.bar" "cap_sys_ptrace,cap_sys_nice+ep" check_capabilities "$FS2/snap_init/foo.bar" "cap_sys_ptrace,cap_sys_nice=ep"
# Test incremental send with different owner/group but same capabilities # Test incremental send with different owner/group but same capabilities
chgrp 100 "$FS1/foo.bar" chgrp 100 "$FS1/foo.bar"
$SETCAP_PROG "cap_sys_ptrace+ep cap_sys_nice+ep" "$FS1/foo.bar" $SETCAP_PROG "cap_sys_ptrace+ep cap_sys_nice+ep" "$FS1/foo.bar"
$BTRFS_UTIL_PROG subvolume snapshot -r "$FS1" "$FS1/snap_inc" >/dev/null $BTRFS_UTIL_PROG subvolume snapshot -r "$FS1" "$FS1/snap_inc" >/dev/null
check_capabilities "$FS1/snap_inc/foo.bar" "cap_sys_ptrace,cap_sys_nice+ep" check_capabilities "$FS1/snap_inc/foo.bar" "cap_sys_ptrace,cap_sys_nice=ep"
$BTRFS_UTIL_PROG send -p "$FS1/snap_init" "$FS1/snap_inc" -q | \ $BTRFS_UTIL_PROG send -p "$FS1/snap_init" "$FS1/snap_inc" -q | \
$BTRFS_UTIL_PROG receive "$FS2" -q $BTRFS_UTIL_PROG receive "$FS2" -q
check_capabilities "$FS2/snap_inc/foo.bar" "cap_sys_ptrace,cap_sys_nice+ep" check_capabilities "$FS2/snap_inc/foo.bar" "cap_sys_ptrace,cap_sys_nice=ep"
# Test capabilities after incremental send with different group and capabilities # Test capabilities after incremental send with different group and capabilities
chgrp 0 "$FS1/foo.bar" chgrp 0 "$FS1/foo.bar"
$SETCAP_PROG "cap_sys_time+ep cap_syslog+ep" "$FS1/foo.bar" $SETCAP_PROG "cap_sys_time+ep cap_syslog+ep" "$FS1/foo.bar"
$BTRFS_UTIL_PROG subvolume snapshot -r "$FS1" "$FS1/snap_inc2" >/dev/null $BTRFS_UTIL_PROG subvolume snapshot -r "$FS1" "$FS1/snap_inc2" >/dev/null
check_capabilities "$FS1/snap_inc2/foo.bar" "cap_sys_time,cap_syslog+ep" check_capabilities "$FS1/snap_inc2/foo.bar" "cap_sys_time,cap_syslog=ep"
$BTRFS_UTIL_PROG send -p "$FS1/snap_inc" "$FS1/snap_inc2" -q | \ $BTRFS_UTIL_PROG send -p "$FS1/snap_inc" "$FS1/snap_inc2" -q | \
$BTRFS_UTIL_PROG receive "$FS2" -q $BTRFS_UTIL_PROG receive "$FS2" -q
check_capabilities "$FS2/snap_inc2/foo.bar" "cap_sys_time,cap_syslog+ep" check_capabilities "$FS2/snap_inc2/foo.bar" "cap_sys_time,cap_syslog=ep"
_scratch_unmount _scratch_unmount
} }
+2 -2
View File
@@ -51,10 +51,10 @@ touch $file
echo "**** Verifying that appending to file clears capabilities ****" echo "**** Verifying that appending to file clears capabilities ****"
$SETCAP_PROG cap_chown+ep $file $SETCAP_PROG cap_chown+ep $file
$GETCAP_PROG $file | filefilter _getcap $file | filefilter
echo data1 >> $file echo data1 >> $file
cat $file cat $file
$GETCAP_PROG $file | filefilter _getcap $file | filefilter
echo echo
echo "**** Verifying that appending to file doesn't clear other xattrs ****" echo "**** Verifying that appending to file doesn't clear other xattrs ****"
+1 -1
View File
@@ -1,7 +1,7 @@
QA output created by 093 QA output created by 093
**** Verifying that appending to file clears capabilities **** **** Verifying that appending to file clears capabilities ****
file = cap_chown+ep file cap_chown=ep
data1 data1
**** Verifying that appending to file doesn't clear other xattrs **** **** Verifying that appending to file doesn't clear other xattrs ****
+2 -2
View File
@@ -40,14 +40,14 @@ $XFS_IO_PROG -f -c "pwrite -S 0x20 0 1m" $SCRATCH_MNT/bar >>$seqres.full
$SETCAP_PROG cap_setgid,cap_setuid+ep $SCRATCH_MNT/bar $SETCAP_PROG cap_setgid,cap_setuid+ep $SCRATCH_MNT/bar
before_cap="$($GETCAP_PROG -v $SCRATCH_MNT/bar)" before_cap="$(_getcap -v $SCRATCH_MNT/bar)"
before_ctime="$(stat -c '%z' $SCRATCH_MNT/bar)" before_ctime="$(stat -c '%z' $SCRATCH_MNT/bar)"
sleep 1 sleep 1
$XFS_IO_PROG -c "reflink $SCRATCH_MNT/foo" $SCRATCH_MNT/bar >> $seqres.full 2>&1 $XFS_IO_PROG -c "reflink $SCRATCH_MNT/foo" $SCRATCH_MNT/bar >> $seqres.full 2>&1
after_cap="$($GETCAP_PROG -v $SCRATCH_MNT/bar)" after_cap="$(_getcap -v $SCRATCH_MNT/bar)"
after_ctime="$(stat -c '%z' $SCRATCH_MNT/bar)" after_ctime="$(stat -c '%z' $SCRATCH_MNT/bar)"
echo "$before_cap $before_ctime" >> $seqres.full echo "$before_cap $before_ctime" >> $seqres.full
+2 -2
View File
@@ -55,7 +55,7 @@ _scratch_mount "-o metacopy=on"
$XFS_IO_PROG -c "stat" ${SCRATCH_MNT}/file1 >>$seqres.full $XFS_IO_PROG -c "stat" ${SCRATCH_MNT}/file1 >>$seqres.full
# Make sure cap_setuid is still there # Make sure cap_setuid is still there
$GETCAP_PROG ${SCRATCH_MNT}/file1 | _filter_scratch _getcap ${SCRATCH_MNT}/file1 | _filter_scratch
# Trigger metadata only copy-up # Trigger metadata only copy-up
chmod 000 ${SCRATCH_MNT}/file2 chmod 000 ${SCRATCH_MNT}/file2
@@ -64,7 +64,7 @@ chmod 000 ${SCRATCH_MNT}/file2
$XFS_IO_PROG -c "stat" ${SCRATCH_MNT}/file2 >>$seqres.full $XFS_IO_PROG -c "stat" ${SCRATCH_MNT}/file2 >>$seqres.full
# Make sure cap_setuid is still there # Make sure cap_setuid is still there
$GETCAP_PROG ${SCRATCH_MNT}/file2 | _filter_scratch _getcap ${SCRATCH_MNT}/file2 | _filter_scratch
# success, all done # success, all done
status=0 status=0
+2 -2
View File
@@ -1,3 +1,3 @@
QA output created by 064 QA output created by 064
SCRATCH_MNT/file1 = cap_setuid+ep SCRATCH_MNT/file1 cap_setuid=ep
SCRATCH_MNT/file2 = cap_setuid+ep SCRATCH_MNT/file2 cap_setuid=ep
+2 -2
View File
@@ -49,7 +49,7 @@ $SETCAP_PROG cap_setgid,cap_setuid+ep $dump_dir/testfile
echo "Checking for xattr on source file" echo "Checking for xattr on source file"
getfattr --absolute-names -m user.name $dump_dir/testfile | _dir_filter getfattr --absolute-names -m user.name $dump_dir/testfile | _dir_filter
echo "Checking for capability on source file" echo "Checking for capability on source file"
$GETCAP_PROG $dump_dir/testfile | _dir_filter _getcap $dump_dir/testfile | _dir_filter
getfattr --absolute-names -m security.capability $dump_dir/testfile | _dir_filter getfattr --absolute-names -m security.capability $dump_dir/testfile | _dir_filter
_do_dump_file -f $tmp.df.0 _do_dump_file -f $tmp.df.0
@@ -62,7 +62,7 @@ _diff_compare
echo "Checking for xattr on restored file" echo "Checking for xattr on restored file"
getfattr --absolute-names -m user.name $restore_dir/$dump_sdir/testfile | _dir_filter getfattr --absolute-names -m user.name $restore_dir/$dump_sdir/testfile | _dir_filter
echo "Checking for capability on restored file" echo "Checking for capability on restored file"
$GETCAP_PROG $restore_dir/$dump_sdir/testfile | _dir_filter _getcap $restore_dir/$dump_sdir/testfile | _dir_filter
getfattr --absolute-names -m security.capability $restore_dir/$dump_sdir/testfile | _dir_filter getfattr --absolute-names -m security.capability $restore_dir/$dump_sdir/testfile | _dir_filter
status=0 status=0
+2 -2
View File
@@ -4,7 +4,7 @@ Checking for xattr on source file
user.name user.name
Checking for capability on source file Checking for capability on source file
DUMP_DIR/testfile = cap_setgid,cap_setuid+ep DUMP_DIR/testfile cap_setgid,cap_setuid=ep
# file: DUMP_DIR/testfile # file: DUMP_DIR/testfile
security.capability security.capability
@@ -50,7 +50,7 @@ Checking for xattr on restored file
user.name user.name
Checking for capability on restored file Checking for capability on restored file
RESTORE_DIR/DUMP_SUBDIR/testfile = cap_setgid,cap_setuid+ep RESTORE_DIR/DUMP_SUBDIR/testfile cap_setgid,cap_setuid=ep
# file: RESTORE_DIR/DUMP_SUBDIR/testfile # file: RESTORE_DIR/DUMP_SUBDIR/testfile
security.capability security.capability