diff options
author | Elliott Hughes <enh@google.com> | 2020-02-05 15:37:16 -0800 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2020-02-11 09:00:43 -0600 |
commit | 8cfcf6d01d86655efec09353fb8f4db0c65e420a (patch) | |
tree | 11714cc1c2a1c11fbdc351711505c47328986b59 | |
parent | 7d15b37b5c23c628929f161dc7df9121c6070cec (diff) | |
download | toybox-8cfcf6d01d86655efec09353fb8f4db0c65e420a.tar.gz |
chattr: fix exit status, redo the tests.
The e2fsprogs chattr(1) returns failure when it fails to do what was
asked of it, and so should we. Fixing this then reveals a lot of issues
with the tests that were being accidentally swept under the carpet.
The bulk of this patch is going through all the tests, removing the
duplicates and making the remaining tests more thorough.
I've tested this on ext4 and f2fs on a variety of 4.x and 5.x kernel
versions (but nothing older). We might need to reduce the list of
attribtues we try to toggle, but the more thorough tests use
well-supported attributes.
I've also fixed the -R test to actually involve a directory hierarchy.
-rwxr-xr-x | tests/chattr.test | 155 | ||||
-rw-r--r-- | toys/other/lsattr.c | 1 |
2 files changed, 40 insertions, 116 deletions
diff --git a/tests/chattr.test b/tests/chattr.test index d7dec0bc..cefc84b9 100755 --- a/tests/chattr.test +++ b/tests/chattr.test @@ -28,131 +28,56 @@ _t="abcdefghijklmnopqrstuvwxyz" _empty="--------------------" -# 'i' -- immutable +# Check +i (immutable) works by trying to write to and remove the file. _i="----i---------------" -testing "[-/+]i FILE[write]" "$IN && touch testFile && +testing "immutable" "$IN && echo "$_t" > testFile && chattr +i testFile && lsattr testFile | clean && - date > testFile 2>/dev/null; chattr -i testFile; - rm -rf testFile; $OUT " "$_i testFile\n" "" "" -testing "[-/+]i FILE[re-write]" "$IN && touch testFile && - chattr +i testFile && date > testFile 2>/dev/null || - chattr -i testFile && date > testFile 2>/dev/null && - lsattr testFile | clean; rm -rf testFile 2>/dev/null; $OUT" \ - "$_empty testFile\n" "" "" -testing "[-/+]i FILE[append]" "$IN && date > testFile && - chattr +i testFile && date >> testFile 2>/dev/null || - lsattr testFile | clean && chattr -i testFile; rm -rf testFile; $OUT" \ - "$_i testFile\n" "" "" -testing "[-/+]i FILE[move]" "$IN && date > testFile && - chattr +i testFile && mv testFile testFile1 2>/dev/null || - lsattr testFile | clean && chattr -i testFile; rm -rf testFile; $OUT" \ - "$_i testFile\n" "" "" -testing "[-/+]i FILE[delete]" "$IN && touch testFile && chattr +i testFile && - rm -f testFile 2>/dev/null || lsattr testFile | clean && - chattr -i testFile; rm -rf testFile; $OUT" "$_i testFile\n" "" "" -testing "[-/+]i FILE[read]" "$IN && echo "$_t" > testFile && - chattr +i testFile && cat testFile && lsattr testFile | clean && - chattr -i testFile; rm -rf testFile; $OUT" "$_t\n$_i testFile\n" "" "" + date > testFile 2>/dev/null; rm testFile; chattr -i testFile; + cat testFile; rm -rf testFile; $OUT " "$_i testFile\n$_t\n" "" "" -# 'a' --- append-only +# Check +a (append-only) works by failing to write and succeeding in appending. _a="-----a--------------" -testing "[-/+]a FILE[write]" "$IN && echo "$_t" > testFile && - chattr +a testFile && echo $_t > testFile || lsattr testFile | clean && - chattr -a testFile; rm -rf testFile; $OUT" "$_a testFile\n" "" "" -testing "[-/+]a FILE[re-write]" "$IN && echo "$_t" > testFile && - chattr +a testFile && echo $_t > testFile || lsattr testFile | clean && - chattr -a testFile && echo $_t > testFile && cat testFile && - lsattr testFile | clean; rm -rf testFile; - $OUT" "$_a testFile\n$_t\n$_empty testFile\n" "" "" -testing "[-/+]a FILE[append]" "$IN && echo "$_t" > testFile && - chattr +a testFile && echo $_t >> testFile && cat testFile && - lsattr testFile | clean && chattr -a testFile; rm -rf testFile; $OUT" \ - "$_t\n$_t\n$_a testFile\n" "" "" -testing "[-/+]a FILE[move]" "$IN && echo "$_t" > testFile && - chattr +a testFile && mv testFile testFile1 || - lsattr testFile | clean && chattr -a testFile; rm -rf testFile; $OUT" \ - "$_a testFile\n" "" "" -testing "[-/+]a FILE[delete]" "$IN && echo "$_t" > testFile && - chattr +a testFile && rm -f testFile || lsattr testFile | clean && - chattr -a testFile; rm -rf testFile; $OUT" "$_a testFile\n" "" "" -testing "[-/+]a FILE[read]" "$IN && echo "$_t" > testFile && - chattr +a testFile && cat testFile && lsattr testFile | clean && - chattr -a testFile; rm -rf testFile; $OUT" "$_t\n$_a testFile\n" "" "" +testing "append-only" "$IN && echo "$_t" > testFile && + chattr +a testFile && + echo $_t >> testFile && + date > testFile || lsattr testFile | clean && + chattr -a testFile; cat testFile; rm -rf testFile; $OUT" \ + "$_a testFile\n$_t\n$_t\n" "" "" -for attr in "A" "a" "c" "D" "d" "i" "j" "s" "S" "t" "T" "u" -do - testing "[-/+]$attr FILE" "$IN && echo "$_t" > testFile && - chattr +$attr testFile && cat testFile && chattr -$attr testFile && - lsattr testFile | clean; rm -rf testFile; $OUT" "$_t\n$_empty testFile\n" "" "" +# For the rest, just toggle the bits back and forth (where supported). +# Note that some file system/kernel combinations do return success but +# silently ignore your request: +T on 4.19 f2fs, or +F on 5.2i ext4, +# for example, so we're deliberately a bit selective here. +for attr in "A" "c" "d" "e" "j" "P" "S" "s" "t" "u"; do + echo "$_t" > testFile && chattr +$attr testFile 2>/dev/null || SKIPNEXT=1 + # Check that $attr is in the lsattr output, then that - turns it back off. + testing "toggle $attr" "lsattr testFile | awk '{print \$1}' > attrs; + grep -q $attr attrs || cat attrs; cat testFile && chattr -$attr testFile && + lsattr testFile | clean; rm -rf testFile" "$_t\n$_empty testFile\n" "" "" done -for attr in "A" "a" "c" "D" "d" "i" "j" "s" "S" "t" "T" "u" -do - testing "-$attr FILE" "$IN && echo "$_t" > testFile && chattr -$attr testFile && - cat testFile && lsattr testFile | clean; rm -rf testFile; $OUT" "$_t\n$_empty testFile\n" "" "" -done +_aA="-----a-A------------" +testing "multiple bits" "$IN && touch testFile && + chattr +Aa testFile && lsattr testFile | clean && + chattr -Aa testFile && lsattr testFile | clean; + rm -rf testFile; $OUT" "$_aA testFile\n$_empty testFile\n" "" "" -testing "[-/+]AacDdijsStTu FILE" "$IN && echo "$_t" > testFile && - chattr +AacDdijsStTu testFile && cat testFile && chattr -AacDdijsStTu testFile && - lsattr testFile | clean; rm -rf testFile; $OUT" "$_t\n$_empty testFile\n" "" "" -testing "[-/+]AacDdijsStTu(random) FILE" \ - "$IN && echo "$_t" > testFile && - chattr +AacDdijsStTu testFile && cat testFile && chattr -A testFile && - chattr -a testFile && chattr -c testFile && chattr -D testFile && - chattr -d testFile && chattr -i testFile && chattr -j testFile && - chattr -s testFile && chattr -S testFile && chattr -t testFile && - chattr -T testFile && chattr -u testFile && lsattr testFile | clean && - chattr -AacDdijsStTu testFile; rm -rf testFile; $OUT" \ - "$_t\n$_empty testFile\n" "" "" -testing "[-/+]AacDdijsStTu FILE*" "$IN && - echo "$_t" > testFile && echo "$_t" > testFile1 && - echo "$_t" > testFile2 && echo "$_t" > testFile3 && - echo "$_t" > testFile4 && echo "$_t" > testFile5 && - echo "$_t" > testFile6 && echo "$_t" > testFile7 && - echo "$_t" > testFile8 && echo "$_t" > testFile9 && - echo "$_t" > testFile10 && echo "$_t" > testFile11 && - chattr +AacDdijsStTu testFile* && - cat testFile9 && chattr -AacDdijsStTu testFile* && - lsattr testFile* | clean; rm -rf testFile*; $OUT" \ - "$_t\n$_empty testFile\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n" "" "" +testing "multiple files" "$IN && touch fileA && touch fileB && + chattr +Aa fileA fileB && lsattr fileA fileB | clean && + chattr -Aa fileA fileB && lsattr fileA fileB | clean; + rm -rf testFile*; $OUT" \ + "$_aA fileA\n$_aA fileB\n$_empty fileA\n$_empty fileB\n" "" "" -# 'A' --- no-atime -_A="-------A------------" -# 's' --- secure erase -_s="s-------------------" -testing "[-/+]AacDdijsStTu(random) FILE*" \ - "$IN && echo "$_t" > testFile && - chattr +AacDdijsStTu testFile* && cat testFile && chattr -A testFile* && - chattr -a testFile* && chattr -c testFile* && chattr -D testFile* && - chattr -d testFile* && chattr -i testFile* && chattr -j testFile* && - chattr -s testFile* && chattr -S testFile* && chattr -t testFile* && - chattr -T testFile* && chattr -u testFile* && lsattr testFile | clean; - rm -rf testFile; $OUT" \ - "$_t\n$_empty testFile\n" "" "" -testing "[-/+]i FILE[write]" \ - "$IN && echo "$_t" > testFile && - chattr +i testFile && - echo \"$_t\" > testFile || lsattr testFile | clean && chattr -i testFile; - rm -rf testFile; $OUT" "$_i testFile\n" "" "" -testing "[-/+]A FILE[write]" \ - "$IN && echo "$_t" > testFile && chattr +A testFile && - echo \"$_t\" > testFile && lsattr testFile | clean && chattr -A testFile; - rm -rf testFile; $OUT" "$_A testFile\n" "" "" -testing "[-/+]s FILE[write]" \ - "$IN && echo "$_t" > testFile && chattr +s testFile && - echo \"$_t\" > testFile && lsattr testFile | clean && chattr -s testFile - rm -rf testFile; $OUT" "$_s testFile\n" "" "" -NOSPACE=1 testing "-v version FILE[write]" \ - "$IN && echo "$_t" > testFile && - chattr -v 1234 testFile && echo \"$_t\" > testFile && - lsattr -v testFile | clean; rm -rf testFile" \ - "_ $_empty testFile\n" "" "" +touch testFile; chattr -v 1234 testFile 2>/dev/null || SKIPNEXT=1 +testing "-v version" "lsattr -v testFile | awk '{print \$1}' && + chattr -v 4567 testFile && lsattr -v testFile | awk '{print \$1}'; + rm -rf testFile" "1234\n4567\n" "" "" -testing "-R [-/+]a FILE" "$IN && touch aa && chattr -R +A aa && - lsattr aa | clean && chattr -R -A aa; rm -rf aa; $OUT" "$_A aa\n" "" "" -testing "-R [-/+]a FILE.." "$IN && touch aa bb && - chattr -R +A aa bb && lsattr aa bb | clean && - chattr -R -A aa bb; rm -rf aa bb; $OUT" "$_A aa\n$_A bb\n" "" "" +mkdir -p a/b/c && touch a/b/c/fA a/b/c/fB +testing "-R" "chattr -R +a a && lsattr a/b/c/fA a/b/c/fB | clean && + chattr -R -a a && rm -rf a" \ + "$_a a/b/c/fA\n$_a a/b/c/fB\n" "" "" +rm -rf a # Clean up rm -rf testattr diff --git a/toys/other/lsattr.c b/toys/other/lsattr.c index 090ac318..cd236b9e 100644 --- a/toys/other/lsattr.c +++ b/toys/other/lsattr.c @@ -353,5 +353,4 @@ void chattr_main(void) if (!(TT.add || TT.rm || TT.set || FLAG(p) || FLAG(v))) error_exit("need '-p', '-v', '=', '-', or '+'"); for (; *argv; argv++) dirtree_read(*argv, update_attr); - toys.exitval = 0; //always set success at this point. } |