summaryrefslogtreecommitdiff
path: root/m4
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2023-05-12 11:56:17 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2023-05-12 11:56:53 -0700
commitb851a965da62cd858d71b2e5a7261a211f00b297 (patch)
tree15702b28dd50bed3b7c4a59071d0cb5dfc5f65e0 /m4
parentdfdf33a46655eea91ce0a7db5821cb99dd985c05 (diff)
downloadgnulib-b851a965da62cd858d71b2e5a7261a211f00b297.tar.gz
file-has-acl: port to Fedora 39
Fedora 39 getxattr with XATTR_NAME_POSIX_ACL_ACCESS either succeeds or fails with ENODATA, so it is no longer possible to detect from its failure that the filesystem might support NFSv4 ACLs. Problem reported by Ondrej Valousek in: https://lists.gnu.org/r/bug-gnulib/2023-04/msg00228.html Instead, use listxattr to determine whether NFSv4 ACLs are in play. This typically saves syscalls anyway. * lib/file-has-acl.c: In #if, use (HAVE_LINUX_XATTR_H && HAVE_LISTXATTR) instead of GETXATTR_WITH_POSIX_ACLS. The following changes apply when (USE_ACL && HAVE_LINUX_XATTR_H && HAVE_LISTXATTR): Include minmax.h. (have_xattr): New function. (file_has_acl): Try listxattr first; typically this means we need to do no other syscall. Call getxattr only if there are NFSv4 ACLs but not POSIX ACLs. * m4/acl.m4 (gl_FILE_HAS_ACL): Simplify by merely testing for linux/xattr.h and listxattr. All uses changed.
Diffstat (limited to 'm4')
-rw-r--r--m4/acl.m446
1 files changed, 16 insertions, 30 deletions
diff --git a/m4/acl.m4 b/m4/acl.m4
index c2f3e2c995..38b1dc6621 100644
--- a/m4/acl.m4
+++ b/m4/acl.m4
@@ -1,5 +1,5 @@
# acl.m4 - check for access control list (ACL) primitives
-# serial 28
+# serial 29
# Copyright (C) 2002, 2004-2023 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
@@ -177,37 +177,23 @@ AC_DEFUN([gl_ACL_GET_FILE],
AS_IF([test "$gl_cv_func_working_acl_get_file" != no], [$1], [$2])
])
-# On GNU/Linux, testing if a file has an acl can be done with the getxattr
-# syscall which doesn't require linking against additional libraries.
+# On GNU/Linux, testing if a file has an acl can be done with the
+# listxattr and getxattr syscalls, which don't require linking
+# against additional libraries. Assume this works if linux/attr.h
+# and listxattr are present.
AC_DEFUN([gl_FILE_HAS_ACL],
[
AC_REQUIRE([gl_FUNC_ACL_ARG])
- if test "$enable_acl" != no; then
- AC_CACHE_CHECK([for getxattr with XATTR_NAME_POSIX_ACL macros],
- [gl_cv_getxattr_with_posix_acls],
- [gl_cv_getxattr_with_posix_acls=no
- AC_LINK_IFELSE(
- [AC_LANG_PROGRAM(
- [[#include <sys/types.h>
- #include <sys/xattr.h>
- #include <linux/xattr.h>
- ]],
- [[ssize_t a = getxattr (".", XATTR_NAME_POSIX_ACL_ACCESS, 0, 0);
- ssize_t b = getxattr (".", XATTR_NAME_POSIX_ACL_DEFAULT, 0, 0);
- return a < 0 || b < 0;
- ]])],
- [gl_cv_getxattr_with_posix_acls=yes])])
- fi
- if test "$gl_cv_getxattr_with_posix_acls" = yes; then
- FILE_HAS_ACL_LIB=
- AC_DEFINE([GETXATTR_WITH_POSIX_ACLS], 1,
- [Define to 1 if getxattr works with XATTR_NAME_POSIX_ACL_ACCESS
- and XATTR_NAME_POSIX_ACL_DEFAULT.])
- else
- dnl Set gl_need_lib_has_acl to a nonempty value, so that any
- dnl later gl_FUNC_ACL call will set FILE_HAS_ACL_LIB=$LIB_ACL.
- gl_need_lib_has_acl=1
- FILE_HAS_ACL_LIB=$LIB_ACL
- fi
+ AC_CHECK_HEADERS_ONCE([linux/xattr.h])
+ AC_CHECK_FUNCS_ONCE([listxattr])
+ FILE_HAS_ACL_LIB=
+ AS_CASE([$enable_acl,$ac_cv_header_linux_xattr_h,$ac_cv_func_listxattr],
+ [no,*,*], [],
+ [*,yes,yes], [],
+ [*],
+ [dnl Set gl_need_lib_has_acl to a nonempty value, so that any
+ dnl later gl_FUNC_ACL call will set FILE_HAS_ACL_LIB=$LIB_ACL.
+ gl_need_lib_has_acl=1
+ FILE_HAS_ACL_LIB=$LIB_ACL])
AC_SUBST([FILE_HAS_ACL_LIB])
])