From 75836c03cb21d616591b11164b626556d9f26152 Mon Sep 17 00:00:00 2001 From: Kamil Dudka Date: Mon, 3 Oct 2011 12:17:22 +0200 Subject: [PATCH] file-has-acl: revert unintended change in behavior of ls -L * lib/file-has-acl.c (acl_extended_file_wrap): A wrapper around acl_extended_file () that allows to call acl_extended_file_nofollow () only if the function is available and the file is not a symbolic link. (file_has_acl): Remove code that caused problems. Call acl_extended_file_wrap (). --- ChangeLog | 9 +++++++++ lib/file-has-acl.c | 39 +++++++++++++++++++++++++++++---------- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index a6d363a..81d9b93 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2011-10-03 Kamil Dudka + + file-has-acl: revert unintended change in behavior of ls -L + * lib/file-has-acl.c (acl_extended_file_wrap): A wrapper around + acl_extended_file () that allows to call acl_extended_file_nofollow () + only if the function is available and the file is not a symbolic link. + (file_has_acl): Remove code that caused problems. Call + acl_extended_file_wrap (). + 2011-10-01 Jim Meyering maint.mk: adjust a release-related rule not to require use of gzip diff --git a/lib/file-has-acl.c b/lib/file-has-acl.c index 1b7e392..42d0c56 100644 --- a/lib/file-has-acl.c +++ b/lib/file-has-acl.c @@ -437,6 +437,33 @@ acl_nontrivial (int count, struct acl *entries) #endif +#if (HAVE_ACL_EXTENDED_FILE) /* Linux */ +static int +acl_extended_file_wrap (char const *name) +{ +# if HAVE_ACL_EXTENDED_FILE_NOFOLLOW + struct stat sb; + if (! lstat (name, &sb) && ! S_ISLNK (sb.st_mode)) + /* acl_extended_file_nofollow() uses lgetxattr() in order to prevent + unnecessary mounts, but it returns the same result as we already + know that NAME is not a symbolic link at this point (modulo the + TOCTTOU race condition). */ + return acl_extended_file_nofollow (name); + +#endif /* HAVE_ACL_EXTENDED_FILE_NOFOLLOW */ + + /* fallback for symlinks and old versions of libacl */ + return acl_extended_file (name); +} +#else /* Linux */ +static int +acl_extended_file_wrap (char const *name) +{ + return -1; +} +#endif /* Linux */ + + /* Return 1 if NAME has a nontrivial access control list, 0 if NAME only has no or a base access control list, and -1 (setting errno) on error. SB must be set to the stat buffer of FILE. */ @@ -453,20 +480,12 @@ file_has_acl (char const *name, struct stat const *sb) /* Linux, FreeBSD, MacOS X, IRIX, Tru64 */ int ret; - if (HAVE_ACL_EXTENDED_FILE || HAVE_ACL_EXTENDED_FILE_NOFOLLOW) /* Linux */ + if (HAVE_ACL_EXTENDED_FILE) /* Linux */ { -# if HAVE_ACL_EXTENDED_FILE_NOFOLLOW - /* acl_extended_file_nofollow() uses lgetxattr() in order to prevent - unnecessary mounts, but it returns the same result as we already - know that NAME is not a symbolic link at this point (modulo the - TOCTTOU race condition). */ - ret = acl_extended_file_nofollow (name); -# else /* On Linux, acl_extended_file is an optimized function: It only makes two calls to getxattr(), one for ACL_TYPE_ACCESS, one for ACL_TYPE_DEFAULT. */ - ret = acl_extended_file (name); -# endif + ret = acl_extended_file_wrap (name); } else /* FreeBSD, MacOS X, IRIX, Tru64 */ { -- 1.7.4.4