[libarchive] libarchive: refined #ifdefs for ACL_TYPE_NFS4
Jaromir Koncicky
jkoncick at fedoraproject.org
Thu Aug 8 12:20:06 UTC 2013
commit da58d4e8afce6acca54475be528f6b948aa2951a
Author: Jaromir Koncicky <jkoncick at redhat.com>
Date: Thu Aug 8 11:53:27 2013 +0200
libarchive: refined #ifdefs for ACL_TYPE_NFS4
Version: 3.1.2-7
Resolves: #993048
libarchive-3.1.2-acl.patch | 219 ++++++++++++++++++++++++++++++++++++++++++++
libarchive.spec | 11 ++-
2 files changed, 229 insertions(+), 1 deletions(-)
---
diff --git a/libarchive-3.1.2-acl.patch b/libarchive-3.1.2-acl.patch
new file mode 100644
index 0000000..ce563b0
--- /dev/null
+++ b/libarchive-3.1.2-acl.patch
@@ -0,0 +1,219 @@
+diff -ruN libarchive-3.1.2/libarchive/archive_read_disk_entry_from_file.c libarchive-3.1.2.fixed/libarchive/archive_read_disk_entry_from_file.c
+--- libarchive-3.1.2/libarchive/archive_read_disk_entry_from_file.c 2013-02-08 01:52:07.000000000 +0100
++++ libarchive-3.1.2.fixed/libarchive/archive_read_disk_entry_from_file.c 2013-08-08 10:47:41.000000000 +0200
+@@ -399,7 +399,7 @@
+ #endif
+
+
+-#if defined(HAVE_POSIX_ACL) && defined(ACL_TYPE_NFS4)
++#ifdef HAVE_POSIX_ACL
+ static int translate_acl(struct archive_read_disk *a,
+ struct archive_entry *entry, acl_t acl, int archive_entry_acl_type);
+
+@@ -419,6 +419,7 @@
+
+ archive_entry_acl_clear(entry);
+
++#ifdef ACL_TYPE_NFS4
+ /* Try NFS4 ACL first. */
+ if (*fd >= 0)
+ acl = acl_get_fd(*fd);
+@@ -447,6 +448,7 @@
+ acl_free(acl);
+ return (ARCHIVE_OK);
+ }
++#endif
+
+ /* Retrieve access ACL from file. */
+ if (*fd >= 0)
+@@ -492,6 +494,7 @@
+ {ARCHIVE_ENTRY_ACL_EXECUTE, ACL_EXECUTE},
+ {ARCHIVE_ENTRY_ACL_WRITE, ACL_WRITE},
+ {ARCHIVE_ENTRY_ACL_READ, ACL_READ},
++#ifdef ACL_TYPE_NFS4
+ {ARCHIVE_ENTRY_ACL_READ_DATA, ACL_READ_DATA},
+ {ARCHIVE_ENTRY_ACL_LIST_DIRECTORY, ACL_LIST_DIRECTORY},
+ {ARCHIVE_ENTRY_ACL_WRITE_DATA, ACL_WRITE_DATA},
+@@ -508,8 +511,10 @@
+ {ARCHIVE_ENTRY_ACL_WRITE_ACL, ACL_WRITE_ACL},
+ {ARCHIVE_ENTRY_ACL_WRITE_OWNER, ACL_WRITE_OWNER},
+ {ARCHIVE_ENTRY_ACL_SYNCHRONIZE, ACL_SYNCHRONIZE}
++#endif
+ };
+
++#ifdef ACL_TYPE_NFS4
+ static struct {
+ int archive_inherit;
+ int platform_inherit;
+@@ -519,21 +524,25 @@
+ {ARCHIVE_ENTRY_ACL_ENTRY_NO_PROPAGATE_INHERIT, ACL_ENTRY_NO_PROPAGATE_INHERIT},
+ {ARCHIVE_ENTRY_ACL_ENTRY_INHERIT_ONLY, ACL_ENTRY_INHERIT_ONLY}
+ };
+-
++#endif
+ static int
+ translate_acl(struct archive_read_disk *a,
+ struct archive_entry *entry, acl_t acl, int default_entry_acl_type)
+ {
+ acl_tag_t acl_tag;
++#ifdef ACL_TYPE_NFS4
+ acl_entry_type_t acl_type;
+ acl_flagset_t acl_flagset;
++ int brand, r;
++#endif
+ acl_entry_t acl_entry;
+ acl_permset_t acl_permset;
+- int brand, i, r, entry_acl_type;
++ int i, entry_acl_type;
+ int s, ae_id, ae_tag, ae_perm;
+ const char *ae_name;
+
+
++#ifdef ACL_TYPE_NFS4
+ // FreeBSD "brands" ACLs as POSIX.1e or NFSv4
+ // Make sure the "brand" on this ACL is consistent
+ // with the default_entry_acl_type bits provided.
+@@ -560,6 +569,7 @@
+ return ARCHIVE_FAILED;
+ break;
+ }
++#endif
+
+
+ s = acl_get_entry(acl, ACL_FIRST_ENTRY, &acl_entry);
+@@ -592,9 +602,11 @@
+ case ACL_OTHER:
+ ae_tag = ARCHIVE_ENTRY_ACL_OTHER;
+ break;
++#ifdef ACL_TYPE_NFS4
+ case ACL_EVERYONE:
+ ae_tag = ARCHIVE_ENTRY_ACL_EVERYONE;
+ break;
++#endif
+ default:
+ /* Skip types that libarchive can't support. */
+ s = acl_get_entry(acl, ACL_NEXT_ENTRY, &acl_entry);
+@@ -605,6 +617,7 @@
+ // XXX acl_get_entry_type_np on FreeBSD returns EINVAL for
+ // non-NFSv4 ACLs
+ entry_acl_type = default_entry_acl_type;
++#ifdef ACL_TYPE_NFS4
+ r = acl_get_entry_type_np(acl_entry, &acl_type);
+ if (r == 0) {
+ switch (acl_type) {
+@@ -634,9 +647,10 @@
+ ae_perm |= acl_inherit_map[i].archive_inherit;
+
+ }
++#endif
+
+ acl_get_permset(acl_entry, &acl_permset);
+- for (i = 0; i < (int)(sizeof(acl_perm_map) / sizeof(acl_perm_map[0])); ++i) {
++ for (i = 0; i < (int)(sizeof(acl_perm_map) / sizeof(acl_perm_map[0])); ++i) {
+ /*
+ * acl_get_perm() is spelled differently on different
+ * platforms; see above.
+diff -ruN libarchive-3.1.2/libarchive/archive_write_disk_acl.c libarchive-3.1.2.fixed/libarchive/archive_write_disk_acl.c
+--- libarchive-3.1.2/libarchive/archive_write_disk_acl.c 2013-01-14 02:43:45.000000000 +0100
++++ libarchive-3.1.2.fixed/libarchive/archive_write_disk_acl.c 2013-08-08 10:31:35.000000000 +0200
+@@ -43,7 +43,7 @@
+ #include "archive_acl_private.h"
+ #include "archive_write_disk_private.h"
+
+-#if !defined(HAVE_POSIX_ACL) || !defined(ACL_TYPE_NFS4)
++#ifndef HAVE_POSIX_ACL
+ /* Default empty function body to satisfy mainline code. */
+ int
+ archive_write_disk_set_acls(struct archive *a, int fd, const char *name,
+@@ -79,10 +79,12 @@
+ ret = set_acl(a, fd, name, abstract_acl, ACL_TYPE_DEFAULT,
+ ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, "default");
+ return (ret);
++#ifdef ACL_TYPE_NFS4
+ } else if (archive_acl_count(abstract_acl, ARCHIVE_ENTRY_ACL_TYPE_NFS4) > 0) {
+ ret = set_acl(a, fd, name, abstract_acl, ACL_TYPE_NFS4,
+ ARCHIVE_ENTRY_ACL_TYPE_NFS4, "nfs4");
+ return (ret);
++#endif
+ } else
+ return ARCHIVE_OK;
+ }
+@@ -94,6 +96,7 @@
+ {ARCHIVE_ENTRY_ACL_EXECUTE, ACL_EXECUTE},
+ {ARCHIVE_ENTRY_ACL_WRITE, ACL_WRITE},
+ {ARCHIVE_ENTRY_ACL_READ, ACL_READ},
++#ifdef ACL_TYPE_NFS4
+ {ARCHIVE_ENTRY_ACL_READ_DATA, ACL_READ_DATA},
+ {ARCHIVE_ENTRY_ACL_LIST_DIRECTORY, ACL_LIST_DIRECTORY},
+ {ARCHIVE_ENTRY_ACL_WRITE_DATA, ACL_WRITE_DATA},
+@@ -110,8 +113,10 @@
+ {ARCHIVE_ENTRY_ACL_WRITE_ACL, ACL_WRITE_ACL},
+ {ARCHIVE_ENTRY_ACL_WRITE_OWNER, ACL_WRITE_OWNER},
+ {ARCHIVE_ENTRY_ACL_SYNCHRONIZE, ACL_SYNCHRONIZE}
++#endif
+ };
+
++#ifdef ACL_TYPE_NFS4
+ static struct {
+ int archive_inherit;
+ int platform_inherit;
+@@ -121,6 +126,7 @@
+ {ARCHIVE_ENTRY_ACL_ENTRY_NO_PROPAGATE_INHERIT, ACL_ENTRY_NO_PROPAGATE_INHERIT},
+ {ARCHIVE_ENTRY_ACL_ENTRY_INHERIT_ONLY, ACL_ENTRY_INHERIT_ONLY}
+ };
++#endif
+
+ static int
+ set_acl(struct archive *a, int fd, const char *name,
+@@ -130,7 +136,9 @@
+ acl_t acl;
+ acl_entry_t acl_entry;
+ acl_permset_t acl_permset;
++#ifdef ACL_TYPE_NFS4
+ acl_flagset_t acl_flagset;
++#endif
+ int ret;
+ int ae_type, ae_permset, ae_tag, ae_id;
+ uid_t ae_uid;
+@@ -171,14 +179,17 @@
+ case ARCHIVE_ENTRY_ACL_OTHER:
+ acl_set_tag_type(acl_entry, ACL_OTHER);
+ break;
++#ifdef ACL_TYPE_NFS4
+ case ARCHIVE_ENTRY_ACL_EVERYONE:
+ acl_set_tag_type(acl_entry, ACL_EVERYONE);
+ break;
++#endif
+ default:
+ /* XXX */
+ break;
+ }
+
++#ifdef ACL_TYPE_NFS4
+ switch (ae_type) {
+ case ARCHIVE_ENTRY_ACL_TYPE_ALLOW:
+ acl_set_entry_type_np(acl_entry, ACL_ENTRY_TYPE_ALLOW);
+@@ -200,6 +211,7 @@
+ // XXX error handling here.
+ break;
+ }
++#endif
+
+ acl_get_permset(acl_entry, &acl_permset);
+ acl_clear_perms(acl_permset);
+@@ -210,6 +222,7 @@
+ acl_perm_map[i].platform_perm);
+ }
+
++#ifdef ACL_TYPE_NFS4
+ acl_get_flagset_np(acl_entry, &acl_flagset);
+ acl_clear_flags_np(acl_flagset);
+ for (i = 0; i < (int)(sizeof(acl_inherit_map) / sizeof(acl_inherit_map[0])); ++i) {
+@@ -217,6 +230,7 @@
+ acl_add_flag_np(acl_flagset,
+ acl_inherit_map[i].platform_inherit);
+ }
++#endif
+ }
+
+ /* Try restoring the ACL through 'fd' if we can. */
diff --git a/libarchive.spec b/libarchive.spec
index dfe68e9..8e6365b 100644
--- a/libarchive.spec
+++ b/libarchive.spec
@@ -1,6 +1,6 @@
Name: libarchive
Version: 3.1.2
-Release: 6%{?dist}
+Release: 7%{?dist}
Summary: A library for handling streaming archive formats
Group: System Environment/Libraries
@@ -30,6 +30,8 @@ Patch0: libarchive-3.1.3-CVE-2013-0211_read_buffer_overflow.patch
Patch1: libarchive-3.1.2-testsuite.patch
+Patch2: libarchive-3.1.2-acl.patch
+
%description
Libarchive is a programming library that can create and read several different
streaming archive formats, including most popular tar variants, several cpio
@@ -72,6 +74,9 @@ libarchive packages.
# fix bugs in testsuite
# ~> upstream ~> 26629c191a & b539b2e597 & 9caa49246
%patch1 -p1 -b .fix-testsuite
+# fix not working saving/restoring acl
+# ~> downstream
+%patch2 -p1 -b .fix-acl
%build
@@ -164,6 +169,10 @@ rm -rf $RPM_BUILD_ROOT
%changelog
+* Thu Aug 08 2013 Jaromir Koncicky <jkoncick at redhat.com> - 3.1.2-7
+- Fixed Bug 993048 - added #ifdef ACL_TYPE_NFS4 to code which requires
+ NFS4 ACL support
+
* Sat Aug 03 2013 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 3.1.2-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
More information about the scm-commits
mailing list