[pve-devel] [PATCH tar v2 2/5] Add acls-bugfix patch for PVE Bug 928

Emmanuel Kasper e.kasper at proxmox.com
Tue Apr 19 11:23:36 CEST 2016


---
 Makefile          |   1 +
 acls-bugfix.patch | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 110 insertions(+)
 create mode 100644 acls-bugfix.patch

diff --git a/Makefile b/Makefile
index 3ed2e94..8062c1c 100644
--- a/Makefile
+++ b/Makefile
@@ -33,6 +33,7 @@ deb ${DEB}: ${TARSRC}
 	echo "debian/SOURCE" >>${TARDIR}/debian/docs
 	mv ${TARDIR}/debian/changelog ${TARDIR}/debian/changelog.org
 	cat changelog ${TARDIR}/debian/changelog.org >${TARDIR}/debian/changelog
+	cd ${TARDIR}; patch -p1 <../acls-bugfix.patch
 	cd ${TARDIR}; dpkg-buildpackage -b -uc -us
 
 .PHONY: upload
diff --git a/acls-bugfix.patch b/acls-bugfix.patch
new file mode 100644
index 0000000..dcdcc0e
--- /dev/null
+++ b/acls-bugfix.patch
@@ -0,0 +1,109 @@
+Description: Do not set default acls when --acls flag is used 
+Origin: http://git.savannah.gnu.org/cgit/tar.git/commit/?id=7fe7adcbb985e78aaf9f78051fa26167779be1f6
+Forwarded: not-needed
+Author: Pavel Raiskup <praiskup at redhat.com>
+Bug-Upstream: http://www.mail-archive.com/bug-tar@gnu.org/msg04355.html
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=819978
+Bug-PVE: https://bugzilla.proxmox.com/show_bug.cgi?id=928
+
+acls: bugfix for default ACLs extraction
+    
+    When --acls option is on (regardless of tarball contents or
+    tarball format), we should explicitly set OR delete default ACLs
+    for extracted directories.  Prior to this update, we always
+    created arbitrary default ACLs based standard file permissions.
+    
+    * configure.ac (with_posix_acls): Check also for acl_free and
+    acl_delete_def_file to mark IEEE 1003.1e ACLs as supported.
+    * src/xattrs.c (acl_delete_def_file_at): New function.
+    (xattrs__acls_set): Do not treat acls_option at all;  Delete
+    default ACLs if appropriate.
+    
+    References:
+    http://www.mail-archive.com/bug-tar@gnu.org/msg04355.html
+    Thanks: Juan J. Martínez and Mark Steinborn
+
+diff --git a/configure.ac b/configure.ac
+index 08bed2b..d393876 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -74,7 +74,8 @@ AC_ARG_WITH([posix-acls],
+ if test "x$with_posix_acls" != "xno"; then
+   AC_CHECK_HEADERS(sys/acl.h,, [with_posix_acls=no])
+   for tar_acl_func in acl_get_file acl_get_fd acl_set_file acl_set_fd \
+-		      acl_to_text acl_from_text; do \
++		      acl_to_text acl_from_text acl_delete_def_file \
++		      acl_free; do \
+     test "x$with_posix_acls" = xno && break
+     AC_SEARCH_LIBS([$tar_acl_func], [acl pacl], [], [with_posix_acls=no])
+   done
+diff --git a/src/xattrs.c b/src/xattrs.c
+index dbaa209..307ee38 100644
+--- a/src/xattrs.c
++++ b/src/xattrs.c
+@@ -61,6 +61,7 @@ static struct
+ static acl_t acl_get_file_at (int, const char *, acl_type_t);
+ static int acl_set_file_at (int, const char *, acl_type_t, acl_t);
+ static int file_has_acl_at (int, char const *, struct stat const *);
++static int acl_delete_def_file_at (int, char const *);
+ 
+ /* acl_get_file_at */
+ #define AT_FUNC_NAME acl_get_file_at
+@@ -88,6 +89,17 @@ static int file_has_acl_at (int, char const *, struct stat const *);
+ #undef AT_FUNC_POST_FILE_PARAM_DECLS
+ #undef AT_FUNC_POST_FILE_ARGS
+ 
++/* acl_delete_def_file_at */
++#define AT_FUNC_NAME acl_delete_def_file_at
++#define AT_FUNC_F1 acl_delete_def_file
++#define AT_FUNC_POST_FILE_PARAM_DECLS
++#define AT_FUNC_POST_FILE_ARGS
++#include "at-func.c"
++#undef AT_FUNC_NAME
++#undef AT_FUNC_F1
++#undef AT_FUNC_POST_FILE_PARAM_DECLS
++#undef AT_FUNC_POST_FILE_ARGS
++
+ /* gnulib file_has_acl_at */
+ #define AT_FUNC_NAME file_has_acl_at
+ #define AT_FUNC_F1 file_has_acl
+@@ -187,7 +199,8 @@ fixup_extra_acl_fields (char *ptr)
+   return ptr;
+ }
+ 
+-/* "system.posix_acl_access" */
++/* Set the "system.posix_acl_access/system.posix_acl_default" extended
++   attribute.  Called only when acls_option > 0. */
+ static void
+ xattrs__acls_set (struct tar_stat_info const *st,
+                   char const *file_name, int type,
+@@ -199,15 +212,23 @@ xattrs__acls_set (struct tar_stat_info const *st,
+     {
+       /* assert (strlen (ptr) == len); */
+       ptr = fixup_extra_acl_fields (ptr);
+-
+       acl = acl_from_text (ptr);
+-      acls_option = 1;
+     }
+-  else if (acls_option > 0)
+-    acl = perms2acl (st->stat.st_mode);
++  else if (def)
++    {
++      /* No "default" IEEE 1003.1e ACL set for directory.  At this moment,
++         FILE_NAME may already have inherited default acls from parent
++         directory;  clean them up. */
++      if (acl_delete_def_file_at (chdir_fd, file_name))
++        WARNOPT (WARN_XATTR_WRITE,
++                (0, errno,
++                 _("acl_delete_def_file_at: Cannot drop default POSIX ACLs "
++                   "for file '%s'"),
++                 file_name));
++      return;
++    }
+   else
+-    return;  /* don't call acl functions unless we first hit an ACL, or
+-		--acls was passed explicitly */
++    acl = perms2acl (st->stat.st_mode);
+ 
+   if (!acl)
+     {
-- 
2.1.4





More information about the pve-devel mailing list