From 2653a3014fe44bb718763655dddb28b2f404ab40 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Sun, 12 Apr 2015 16:36:38 +0200 Subject: [PATCH] qacl: Simplify HP-UX acl_nontrivial check * lib/acl-internal.c: Remove struct stat parameter from HP-UX's version of acl_nontrivial. Check if the acl has at most three entries instead (it must have exactly three entries according to the HP-UX documentation). Ignore uids and gids as long as an entry is either for a user (i.e., the owner), a group (i.e., the owning group), or others. * lib/acl-internal.h: Change HP-UX's acl_nontrivial prototype. * lib/qcopy-acl.c (qcopy_acl): With that, we no longer need to stat the source file. --- ChangeLog | 11 +++++++++++ lib/acl-internal.c | 11 ++++++----- lib/acl-internal.h | 2 +- lib/qcopy-acl.c | 17 +++-------------- 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/ChangeLog b/ChangeLog index de8cc66625..59bcf264c6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2015-04-15 Andreas Gruenbacher + + qacl: Simplify HP-UX acl_nontrivial check + * lib/acl-internal.c: Remove struct stat parameter from HP-UX's version of + acl_nontrivial. Check if the acl has at most three entries instead (it must + have exactly three entries according to the HP-UX documentation). Ignore + uids and gids as long as an entry is either for a user (i.e., the owner), + a group (i.e., the owning group), or others. + * lib/acl-internal.h: Change HP-UX's acl_nontrivial prototype. + * lib/qcopy-acl.c (qcopy_acl): With that, we no longer need to stat the file. + 2015-04-15 Andreas Gruenbacher acl: On Linux, check for acls without libacl diff --git a/lib/acl-internal.c b/lib/acl-internal.c index 7a465c1a98..d9bd4461ea 100644 --- a/lib/acl-internal.c +++ b/lib/acl-internal.c @@ -336,18 +336,19 @@ acl_ace_nontrivial (int count, ace_t *entries) /* Return 1 if the given ACL is non-trivial. Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */ int -acl_nontrivial (int count, struct acl_entry *entries, struct stat *sb) +acl_nontrivial (int count, struct acl_entry *entries) { int i; + if (count > 3) + return 1; + for (i = 0; i < count; i++) { struct acl_entry *ace = &entries[i]; - if (!((ace->uid == sb->st_uid && ace->gid == ACL_NSGROUP) - || (ace->uid == ACL_NSUSER && ace->gid == sb->st_gid) - || (ace->uid == ACL_NSUSER && ace->gid == ACL_NSGROUP))) - return 1; + if (ace->uid != ACL_NSUSER && ace->gid != ACL_NSGROUP) + return 1; } return 0; } diff --git a/lib/acl-internal.h b/lib/acl-internal.h index 243ca32b82..9b9fae2e9e 100644 --- a/lib/acl-internal.h +++ b/lib/acl-internal.h @@ -220,7 +220,7 @@ extern int acl_ace_nontrivial (int count, ace_t *entries) _GL_ATTRIBUTE_PURE; /* Return 1 if the given ACL is non-trivial. Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */ -extern int acl_nontrivial (int count, struct acl_entry *entries, struct stat *sb); +extern int acl_nontrivial (int count, struct acl_entry *entries); # if HAVE_ACLV_H /* HP-UX >= 11.11 */ diff --git a/lib/qcopy-acl.c b/lib/qcopy-acl.c index aac76a1243..bc258ba560 100644 --- a/lib/qcopy-acl.c +++ b/lib/qcopy-acl.c @@ -437,20 +437,9 @@ qcopy_acl (const char *src_name, int source_desc, const char *dst_name, if (ret < 0 && saved_errno == 0) { saved_errno = errno; - if (errno == ENOSYS || errno == EOPNOTSUPP || errno == ENOTSUP) - { - struct stat source_statbuf; - - if ((source_desc != -1 - ? fstat (source_desc, &source_statbuf) - : stat (src_name, &source_statbuf)) == 0) - { - if (!acl_nontrivial (count, entries, &source_statbuf)) - saved_errno = 0; - } - else - saved_errno = errno; - } + if (errno == ENOSYS || errno == EOPNOTSUPP || errno == ENOTSUP + && !acl_nontrivial (count, entries)) + saved_errno = 0; } else did_chmod = 1; -- 2.39.5