]> gitweb.michael.orlitzky.com - apply-default-acl.git/commitdiff
Fix symlink handling and update to version 0.0.6.
authorMichael Orlitzky <michael@orlitzky.com>
Mon, 3 Oct 2016 14:06:11 +0000 (10:06 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Mon, 3 Oct 2016 14:06:11 +0000 (10:06 -0400)
There was kind of a big bug in previous versions: symlinks were
followed and they weren't supposed to be. This came down to a few
"stat" calls that should have been "lstat" calls. Those changes have
been made, and there's now a test for the correct behavior.

Unrelated: I capitalized the 'n' in the "No such file..." error.

configure.ac
run-tests.sh
src/apply-default-acl.c

index 4f4f2da7161199ee4d851a7ee4bcef7bac92b21d..c27901509063e3a5cb24f6d190ba834b5f1763aa 100644 (file)
@@ -2,7 +2,7 @@
 # Process this file with autoconf to produce a configure script.
 
 AC_PREREQ([2.68])
-AC_INIT([apply-default-acl], [0.0.5], [michael@orlitzky.com])
+AC_INIT([apply-default-acl], [0.0.6], [michael@orlitzky.com])
 AM_INIT_AUTOMAKE
 AC_CONFIG_SRCDIR([src/apply-default-acl.c])
 AC_CONFIG_FILES([Makefile src/Makefile])
index 5f11c688f5163d1cb379d8947a38a1397779cf9f..a76b0e993578222bbec89edae5ea4fe0e104ab9a 100755 (executable)
@@ -690,3 +690,22 @@ touch "${DUMMY1}" "${DUMMY2}"
 ACTUAL=$( ${BIN} "${DUMMY1}" test/nonexistent "${DUMMY2}" 2>&1 )
 EXPECTED="${BIN}: test/nonexistent: no such file or directory"
 compare
+
+
+# Ensure that symlinks are not followed.
+TESTNUM=28
+TARGET="${TESTDIR}/foo"
+LINK2TARGET="${TESTDIR}/foo-sym"
+touch "${TARGET}"
+ln -s "${TARGET#${TESTDIR}/}" "${LINK2TARGET}"
+setfacl --default --modify user:${USERS[0]}:rwx "${TESTDIR}"
+"${BIN}" "${LINK2TARGET}"
+ACTUAL=$( getfacl --omit-header "${TARGET}" )
+EXPECTED=$(cat <<EOF
+user::rw-
+group::r--
+other::r--
+
+EOF
+)
+compare
index 0c43af7d975088c06019c8a44e69b66f14cdf63a..19505282c2acda17960281e966a9d347a5bc1611 100644 (file)
@@ -51,13 +51,13 @@ mode_t get_mode(const char* path) {
   }
 
   struct stat s;
-  int result = stat(path, &s);
+  int result = lstat(path, &s);
 
   if (result == 0) {
     return s.st_mode;
   }
   else {
-    /* errno will be set already by stat() */
+    /* errno will be set already by lstat() */
     return result;
   }
 }
@@ -78,7 +78,7 @@ bool is_regular_file(const char* path) {
   }
 
   struct stat s;
-  int result = stat(path, &s);
+  int result = lstat(path, &s);
   if (result == 0) {
     return S_ISREG(s.st_mode);
   }
@@ -139,7 +139,7 @@ bool is_directory(const char* path) {
   }
 
   struct stat s;
-  int result = stat(path, &s);
+  int result = lstat(path, &s);
   if (result == 0) {
     return S_ISDIR(s.st_mode);
   }
@@ -1014,7 +1014,7 @@ int main(int argc, char* argv[]) {
      * typos, too.
      */
     if (!path_accessible(target)) {
-      fprintf(stderr, "%s: %s: no such file or directory\n", argv[0], target);
+      fprintf(stderr, "%s: %s: No such file or directory\n", argv[0], target);
       result = EXIT_FAILURE;
       continue;
     }