OSDN Git Service

Fix find -perm.
authorElliott Hughes <enh@google.com>
Fri, 13 Nov 2015 21:29:58 +0000 (13:29 -0800)
committerRob Landley <rob@landley.net>
Thu, 19 Nov 2015 16:16:19 +0000 (10:16 -0600)
1) It read st_dev instead of st_mode.
2) It reversed the semantics of absolute vs minimal ('-' prefixed) tests.

Add tests for these, and move the "unterminated -exec" test into the "Still
fails" section because it's still dumping core for me.

tests/find.test
toys/posix/find.c

index 4e856f4..2f17bf7 100755 (executable)
@@ -8,6 +8,11 @@ touch file
 mkfifo fifo
 ln -s fifo link
 cd ..
+touch b
+
+mkdir perm
+touch perm/all-read-only
+chmod a=r perm/all-read-only
 
 #testing "name" "command" "result" "infile" "stdin"
 
@@ -23,7 +28,7 @@ testing "find -type l -o -type d -type p" "find dir -type l -o -type d -type p"
        "dir/link\n" "" ""
 testing "find -type l ( -type d -o -type l )" \
        "find dir -type l \( -type d -o -type l \)" "dir/link\n" "" ""
-testing "find extra parantheses" \
+testing "find extra parentheses" \
        "find dir \( \( -type l \) \( -type d -o \( \( -type l \) \) \) \)" \
        "dir/link\n" "" ""
 testing "find ( -type p -o -type d ) -type p" \
@@ -49,11 +54,17 @@ testing "find -type f -user -exec" \
   "find dir -type f -user $USER -exec ls {} \\;" "dir/file\n" "" ""
 testing "find -type l -newer -exec" \
   "find dir -type l -newer dir/file -exec ls {} \\;" "dir/link\n" "" ""
-testing "find unterminated -exec {}" \
-  "find dir -type f -exec ls {}" "" "" ""
+testing "find -perm (exact success)" \
+  "find perm -type f -perm 0444" "perm/all-read-only\n" "" ""
+testing "find -perm (exact failure)" \
+  "find perm -type f -perm 0400" "" "" ""
+testing "find -perm (at least)" \
+  "find perm -type f -perm -0400" "perm/all-read-only\n" "" ""
 
 # Still fails
 
+testing "find unterminated -exec {}" \
+  "find dir -type f -exec ls {}" "" "" ""
 testing "find -exec {} +" \
   "find dir -type f -exec ls {} +" "dir/file\n" "" ""
 
index aca1984..f670184 100644 (file)
@@ -279,9 +279,9 @@ static int do_find(struct dirtree *new)
         if (check) {
           char *m = ss[1];
           mode_t m1 = string_to_mode(m+(*m == '-'), 0),
-                 m2 = new->st.st_dev & 07777;
+                 m2 = new->st.st_mode & 07777;
 
-          if (*m != '-') m2 &= m1;
+          if (*m == '-') m2 &= m1;
           test = m1 == m2;
         }
       } else if (!strcmp(s, "type")) {