From 39d1dc121255b92aac5cb9e47f810ca761e08af1 Mon Sep 17 00:00:00 2001 From: Emmanuel Kasper Date: Tue, 19 Apr 2016 11:23:36 +0200 Subject: [PATCH] Add acls-bugfix patch for PVE Bug 928 --- 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 +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.39.2