fix xattrs detection (no bug #)

This commit is contained in:
Radek Brich 2007-12-12 13:47:18 +00:00
parent f6c182b667
commit 7254d79420
4 changed files with 11907 additions and 342 deletions

11808
tar-1.17-xattrs-conf.patch Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,310 +1,6 @@
--- tar-1.17/configure.xattrs 2007-06-08 10:36:00.000000000 +0200 diff -up tar-1.17/configure.ac.xattrs tar-1.17/configure.ac
+++ tar-1.17/configure 2007-06-27 17:18:14.000000000 +0200
@@ -514,19 +514,29 @@ else
as_mkdir_p=false
fi
-# Find out whether ``test -x'' works. Don't use a zero-byte file, as
-# systems may use methods other than mode bits to determine executability.
-cat >conf$$.file <<_ASEOF
-#! /bin/sh
-exit 0
-_ASEOF
-chmod +x conf$$.file
-if test -x conf$$.file >/dev/null 2>&1; then
- as_executable_p="test -x"
+if test -x / >/dev/null 2>&1; then
+ as_test_x='test -x'
else
- as_executable_p=:
+ if ls -dL / >/dev/null 2>&1; then
+ as_ls_L_option=L
+ else
+ as_ls_L_option=
+ fi
+ as_test_x='
+ eval sh -c '\''
+ if test -d "$1"; then
+ test -d "$1/.";
+ else
+ case $1 in
+ -*)set "./$1";;
+ esac;
+ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+ ???[sx]*):;;*)false;;esac;fi
+ '\'' sh
+ '
fi
-rm -f conf$$.file
+as_executable_p=$as_test_x
+
# Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -1925,6 +1935,9 @@ ac_header_list="$ac_header_list sys/tpri
ac_header_list="$ac_header_list sys/tape.h"
ac_header_list="$ac_header_list unistd.h"
ac_header_list="$ac_header_list locale.h"
+ac_header_list="$ac_header_list selinux/selinux.h"
+ac_header_list="$ac_header_list attr/xattr.h"
+ac_header_list="$ac_header_list sys/acl.h"
ac_func_list="$ac_func_list flockfile"
ac_func_list="$ac_func_list funlockfile"
ac_header_list="$ac_header_list features.h"
@@ -34101,6 +34114,251 @@ _ACEOF
fi
done
+
+for ac_func in getxattr fgetxattr lgetxattr \
+ setxattr fsetxattr lsetxattr \
+ listxattr flistxattr llistxattr
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_XATTRS
+_ACEOF
+
+fi
+done
+
+
+{ echo "$as_me:$LINENO: checking for getfilecon in -lselinux" >&5
+echo $ECHO_N "checking for getfilecon in -lselinux... $ECHO_C" >&6; }
+if test "${ac_cv_lib_selinux_getfilecon+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lselinux $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char getfilecon ();
+int
+main ()
+{
+return getfilecon ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_lib_selinux_getfilecon=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_selinux_getfilecon=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_selinux_getfilecon" >&5
+echo "${ECHO_T}$ac_cv_lib_selinux_getfilecon" >&6; }
+if test $ac_cv_lib_selinux_getfilecon = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBSELINUX 1
+_ACEOF
+
+ LIBS="-lselinux $LIBS"
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking for acl_get_fd in -lacl" >&5
+echo $ECHO_N "checking for acl_get_fd in -lacl... $ECHO_C" >&6; }
+if test "${ac_cv_lib_acl_acl_get_fd+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lacl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char acl_get_fd ();
+int
+main ()
+{
+return acl_get_fd ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_lib_acl_acl_get_fd=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_acl_acl_get_fd=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_acl_acl_get_fd" >&5
+echo "${ECHO_T}$ac_cv_lib_acl_acl_get_fd" >&6; }
+if test $ac_cv_lib_acl_acl_get_fd = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBACL 1
+_ACEOF
+
+ LIBS="-lacl $LIBS"
+
+fi
+
+
+
+
{ echo "$as_me:$LINENO: checking whether getgrgid is declared" >&5
echo $ECHO_N "checking whether getgrgid is declared... $ECHO_C" >&6; }
if test "${ac_cv_have_decl_getgrgid+set}" = set; then
--- tar-1.17/configure.ac.xattrs 2007-06-08 10:28:04.000000000 +0200 --- tar-1.17/configure.ac.xattrs 2007-06-08 10:28:04.000000000 +0200
+++ tar-1.17/configure.ac 2007-06-27 17:10:56.000000000 +0200 +++ tar-1.17/configure.ac 2007-12-10 15:31:54.000000000 +0100
@@ -40,7 +40,7 @@ AC_CHECK_HEADERS_ONCE(fcntl.h linux/fd.h @@ -40,7 +40,7 @@ AC_CHECK_HEADERS_ONCE(fcntl.h linux/fd.h
sys/param.h sys/device.h sys/filio.h sys/gentape.h \ sys/param.h sys/device.h sys/filio.h sys/gentape.h \
sys/inet.h sys/io/trioctl.h \ sys/inet.h sys/io/trioctl.h \
@ -337,8 +33,9 @@
AC_CHECK_TYPE(iconv_t,:, AC_CHECK_TYPE(iconv_t,:,
AC_DEFINE(iconv_t, int, AC_DEFINE(iconv_t, int,
[Conversion descriptor type]), [Conversion descriptor type]),
diff -up tar-1.17/doc/tar.texi.xattrs tar-1.17/doc/tar.texi
--- tar-1.17/doc/tar.texi.xattrs 2007-06-08 10:25:19.000000000 +0200 --- tar-1.17/doc/tar.texi.xattrs 2007-06-08 10:25:19.000000000 +0200
+++ tar-1.17/doc/tar.texi 2007-06-27 17:10:56.000000000 +0200 +++ tar-1.17/doc/tar.texi 2007-12-10 15:31:54.000000000 +0100
@@ -7845,6 +7845,8 @@ implementation able to read @samp{ustar} @@ -7845,6 +7845,8 @@ implementation able to read @samp{ustar}
most @samp{posix} archives as well, with the only exception that any most @samp{posix} archives as well, with the only exception that any
additional information (such as long file names etc.) will in such additional information (such as long file names etc.) will in such
@ -400,8 +97,9 @@
@end table @end table
@node Portability @node Portability
diff -up tar-1.17/src/Makefile.in.xattrs tar-1.17/src/Makefile.in
--- tar-1.17/src/Makefile.in.xattrs 2007-06-08 10:35:58.000000000 +0200 --- tar-1.17/src/Makefile.in.xattrs 2007-06-08 10:35:58.000000000 +0200
+++ tar-1.17/src/Makefile.in 2007-06-27 17:11:28.000000000 +0200 +++ tar-1.17/src/Makefile.in 2007-12-10 15:31:54.000000000 +0100
@@ -1,8 +1,8 @@ @@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.10a from Makefile.am. -# Makefile.in generated by automake 1.10a from Makefile.am.
+# Makefile.in generated by automake 1.10 from Makefile.am. +# Makefile.in generated by automake 1.10 from Makefile.am.
@ -472,8 +170,9 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xheader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xheader.Po@am__quote@
.c.o: .c.o:
diff -up tar-1.17/src/common.h.xattrs tar-1.17/src/common.h
--- tar-1.17/src/common.h.xattrs 2007-06-08 10:14:42.000000000 +0200 --- tar-1.17/src/common.h.xattrs 2007-06-08 10:14:42.000000000 +0200
+++ tar-1.17/src/common.h 2007-06-27 17:10:56.000000000 +0200 +++ tar-1.17/src/common.h 2007-12-10 15:31:54.000000000 +0100
@@ -255,6 +255,15 @@ GLOBAL int same_owner_option; @@ -255,6 +255,15 @@ GLOBAL int same_owner_option;
/* If positive, preserve permissions when extracting. */ /* If positive, preserve permissions when extracting. */
GLOBAL int same_permissions_option; GLOBAL int same_permissions_option;
@ -513,9 +212,10 @@
/* Module system.c */ /* Module system.c */
--- /dev/null 2007-06-25 09:32:25.472134050 +0200 diff -up /dev/null tar-1.17/src/xattrs.c
+++ tar-1.17/src/xattrs.c 2007-06-27 17:10:56.000000000 +0200 --- /dev/null 2007-12-10 11:30:31.504001819 +0100
@@ -0,0 +1,457 @@ +++ tar-1.17/src/xattrs.c 2007-12-10 15:31:54.000000000 +0100
@@ -0,0 +1,491 @@
+/* Create a tar archive. +/* Create a tar archive.
+ +
+ Copyright (C) 2006 Free Software Foundation, Inc. + Copyright (C) 2006 Free Software Foundation, Inc.
@ -675,6 +375,12 @@
+{ +{
+ if (acls_option > 0) + if (acls_option > 0)
+ { + {
+#ifndef HAVE_LIBACL
+ static int done = 0;
+ if (!done)
+ WARN ((0, 0, _("ACL support requested, but not available")));
+ done = 1;
+#endif
+ xattrs__acls_get_a (st, file_name, fd, + xattrs__acls_get_a (st, file_name, fd,
+ &st->acls_a_ptr, &st->acls_a_len); + &st->acls_a_ptr, &st->acls_a_len);
+ if (!xisfile) + if (!xisfile)
@ -685,8 +391,14 @@
+ +
+void xattrs_selinux_get(struct tar_stat_info *st, char const *file_name, int fd) +void xattrs_selinux_get(struct tar_stat_info *st, char const *file_name, int fd)
+{ +{
+#ifdef HAVE_LIBSELINUX
+ if (selinux_context_option > 0) + if (selinux_context_option > 0)
+ {
+#ifndef HAVE_LIBSELINUX
+ static int done = 0;
+ if (!done)
+ WARN ((0, 0, _("SELinux support requested, but not available")));
+ done = 1;
+#else
+ if (fd == -1) + if (fd == -1)
+ { + {
+ if (lgetfilecon (file_name, &st->cntx_name) == -1) + if (lgetfilecon (file_name, &st->cntx_name) == -1)
@ -695,11 +407,11 @@
+ else if (fgetfilecon (fd, &st->cntx_name) == -1) + else if (fgetfilecon (fd, &st->cntx_name) == -1)
+ call_arg_warn ("fgetfilecon", file_name); + call_arg_warn ("fgetfilecon", file_name);
+#endif +#endif
+ }
+} +}
+ +
+void xattrs_xattrs_get(struct tar_stat_info *st, char const *file_name, int fd) +void xattrs_xattrs_get(struct tar_stat_info *st, char const *file_name, int fd)
+{ +{
+#ifdef HAVE_XATTRS
+ if (xattrs_option > 0) + if (xattrs_option > 0)
+ { /* get all xattrs ... this include security.* and system.* if + { /* get all xattrs ... this include security.* and system.* if
+ available. We filter them here, but we have to filter them + available. We filter them here, but we have to filter them
@ -709,6 +421,13 @@
+ static char *xatrs = NULL; + static char *xatrs = NULL;
+ ssize_t xret = -1; + ssize_t xret = -1;
+ +
+#ifndef HAVE_XATTRS
+ static int done = 0;
+ if ((xattrs_option > 0) && !done)
+ WARN ((0, 0, _("Xattr support requested, but not available")));
+ done = 1;
+#else
+
+ if (!xatrs) xatrs = xmalloc (xsz); + if (!xatrs) xatrs = xmalloc (xsz);
+ +
+ while (((fd == -1) ? + while (((fd == -1) ?
@ -758,8 +477,8 @@
+ xret -= len + 1; + xret -= len + 1;
+ } + }
+ } + }
+ }
+#endif +#endif
+ }
+} +}
+ +
+static void xattrs__fd_set(struct tar_stat_info const *st, +static void xattrs__fd_set(struct tar_stat_info const *st,
@ -908,7 +627,12 @@
+{ +{
+ if ((acls_option >= 0) && (typeflag != SYMTYPE)) + if ((acls_option >= 0) && (typeflag != SYMTYPE))
+ { + {
+#ifdef HAVE_LIBACL +#ifndef HAVE_LIBACL
+ static int done = 0;
+ if (!done)
+ WARN ((0, 0, _("ACL support requested, but not available")));
+ done = 1;
+#else
+ xattrs__acls_set (st, file_name, ACL_TYPE_ACCESS, + xattrs__acls_set (st, file_name, ACL_TYPE_ACCESS,
+ st->acls_a_ptr, st->acls_a_len); + st->acls_a_ptr, st->acls_a_len);
+ if (S_ISDIR (st->stat.st_mode)) + if (S_ISDIR (st->stat.st_mode))
@ -921,12 +645,17 @@
+void xattrs_selinux_set(struct tar_stat_info const *st, +void xattrs_selinux_set(struct tar_stat_info const *st,
+ char const *file_name, char typeflag) + char const *file_name, char typeflag)
+{ +{
+#ifdef HAVE_LIBSELINUX
+ if ((selinux_context_option >= 0) && st->cntx_name) + if ((selinux_context_option >= 0) && st->cntx_name)
+ { + {
+ const char *sysname = "setfilecon"; + const char *sysname = "setfilecon";
+ int ret = -1; + int ret = -1;
+ +
+#ifndef HAVE_LIBSELINUX
+ static int done = 0;
+ if (!done)
+ WARN ((0, 0, _("SELinux support requested, but not available")));
+ done = 1;
+#else
+ if (typeflag != SYMTYPE) + if (typeflag != SYMTYPE)
+ ret = setfilecon (file_name, st->cntx_name); + ret = setfilecon (file_name, st->cntx_name);
+ else + else
@ -939,18 +668,23 @@
+ call_arg_warn(sysname, file_name); + call_arg_warn(sysname, file_name);
+ else if ((ret == -1) && (errno != EOPNOTSUPP)) + else if ((ret == -1) && (errno != EOPNOTSUPP))
+ call_arg_error(sysname, file_name); + call_arg_error(sysname, file_name);
+ }
+#endif +#endif
+ }
+} +}
+ +
+void xattrs_xattrs_set(struct tar_stat_info const *st, +void xattrs_xattrs_set(struct tar_stat_info const *st,
+ char const *file_name, char typeflag) + char const *file_name, char typeflag)
+{ +{
+#ifdef HAVE_XATTRS
+ if ((xattrs_option >= 0) && st->xattr_map_size) + if ((xattrs_option >= 0) && st->xattr_map_size)
+ { + {
+ size_t scan = 0; + size_t scan = 0;
+ +
+#ifndef HAVE_XATTRS
+ static int done = 0;
+ if (!done)
+ WARN ((0, 0, _("Xattr support requested, but not available")));
+ done = 1;
+#else
+ while (scan < st->xattr_map_size) + while (scan < st->xattr_map_size)
+ { + {
+ char *keyword = st->xattr_map[scan].xkey; + char *keyword = st->xattr_map[scan].xkey;
@ -969,12 +703,13 @@
+ +
+ ++scan; + ++scan;
+ } + }
+ }
+#endif +#endif
+ }
+} +}
+ +
diff -up tar-1.17/src/tar.c.xattrs tar-1.17/src/tar.c
--- tar-1.17/src/tar.c.xattrs 2007-06-01 12:17:10.000000000 +0200 --- tar-1.17/src/tar.c.xattrs 2007-06-01 12:17:10.000000000 +0200
+++ tar-1.17/src/tar.c 2007-06-27 17:10:56.000000000 +0200 +++ tar-1.17/src/tar.c 2007-12-10 15:31:54.000000000 +0100
@@ -247,7 +247,8 @@ tar_set_quoting_style (char *arg) @@ -247,7 +247,8 @@ tar_set_quoting_style (char *arg)
enum enum
@ -1133,8 +868,9 @@
free (st->sparse_map); free (st->sparse_map);
free (st->dumpdir); free (st->dumpdir);
xheader_destroy (&st->xhdr); xheader_destroy (&st->xhdr);
diff -up tar-1.17/src/xheader.c.xattrs tar-1.17/src/xheader.c
--- tar-1.17/src/xheader.c.xattrs 2007-06-01 12:17:10.000000000 +0200 --- tar-1.17/src/xheader.c.xattrs 2007-06-01 12:17:10.000000000 +0200
+++ tar-1.17/src/xheader.c 2007-06-27 17:10:56.000000000 +0200 +++ tar-1.17/src/xheader.c 2007-12-10 15:31:54.000000000 +0100
@@ -419,6 +419,74 @@ xheader_write_global (struct xheader *xh @@ -419,6 +419,74 @@ xheader_write_global (struct xheader *xh
free (name); free (name);
} }
@ -1434,8 +1170,9 @@
+ +
{ NULL, NULL, NULL, false } { NULL, NULL, NULL, false }
}; };
--- tar-1.17/src/list.c.xattrs 2007-06-27 17:10:56.000000000 +0200 diff -up tar-1.17/src/list.c.xattrs tar-1.17/src/list.c
+++ tar-1.17/src/list.c 2007-06-27 17:10:56.000000000 +0200 --- tar-1.17/src/list.c.xattrs 2007-12-10 15:31:54.000000000 +0100
+++ tar-1.17/src/list.c 2007-12-10 15:31:54.000000000 +0100
@@ -567,6 +567,13 @@ decode_header (union block *header, stru @@ -567,6 +567,13 @@ decode_header (union block *header, stru
assign_string (&stat_info->gname, assign_string (&stat_info->gname,
header->header.gname[0] ? header->header.gname : NULL); header->header.gname[0] ? header->header.gname : NULL);
@ -1450,8 +1187,9 @@
if (format == OLDGNU_FORMAT && incremental_option) if (format == OLDGNU_FORMAT && incremental_option)
{ {
stat_info->atime.tv_sec = TIME_FROM_HEADER (header->oldgnu_header.atime); stat_info->atime.tv_sec = TIME_FROM_HEADER (header->oldgnu_header.atime);
diff -up tar-1.17/src/Makefile.am.xattrs tar-1.17/src/Makefile.am
--- tar-1.17/src/Makefile.am.xattrs 2006-12-05 08:37:59.000000000 +0100 --- tar-1.17/src/Makefile.am.xattrs 2006-12-05 08:37:59.000000000 +0100
+++ tar-1.17/src/Makefile.am 2007-06-27 17:10:56.000000000 +0200 +++ tar-1.17/src/Makefile.am 2007-12-10 15:31:54.000000000 +0100
@@ -20,7 +20,7 @@ @@ -20,7 +20,7 @@
bin_PROGRAMS = tar bin_PROGRAMS = tar
@ -1475,8 +1213,9 @@
-tar_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME) -tar_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME)
+tar_LDADD = $(LIBS) $(LDADD) $(LIB_CLOCK_GETTIME) +tar_LDADD = $(LIBS) $(LDADD) $(LIB_CLOCK_GETTIME)
diff -up tar-1.17/src/create.c.xattrs tar-1.17/src/create.c
--- tar-1.17/src/create.c.xattrs 2007-06-01 12:17:10.000000000 +0200 --- tar-1.17/src/create.c.xattrs 2007-06-01 12:17:10.000000000 +0200
+++ tar-1.17/src/create.c 2007-06-27 17:10:56.000000000 +0200 +++ tar-1.17/src/create.c 2007-12-10 15:31:54.000000000 +0100
@@ -24,6 +24,7 @@ @@ -24,6 +24,7 @@
#include <quotearg.h> #include <quotearg.h>
@ -1516,19 +1255,20 @@
return header; return header;
} }
@@ -1570,6 +1595,10 @@ dump_file0 (struct tar_stat_info *st, co @@ -1572,6 +1597,10 @@ dump_file0 (struct tar_stat_info *st, co
open_diag (p);
return;
} }
+
+ xattrs_acls_get(st, p, fd, !is_dir);
+ xattrs_selinux_get(st, p, fd);
+ xattrs_xattrs_get(st, p, fd);
} }
+ xattrs_acls_get(st, p, fd, !is_dir);
+ xattrs_selinux_get(st, p, fd);
+ xattrs_xattrs_get(st, p, fd);
+
if (is_dir) if (is_dir)
--- /dev/null 2007-06-25 09:32:25.472134050 +0200 {
+++ tar-1.17/src/xattrs.h 2007-06-27 17:10:56.000000000 +0200 const char *tag_file_name;
diff -up /dev/null tar-1.17/src/xattrs.h
--- /dev/null 2007-12-10 11:30:31.504001819 +0100
+++ tar-1.17/src/xattrs.h 2007-12-10 15:31:54.000000000 +0100
@@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
+ +
+extern void xattrs_acls_get(struct tar_stat_info *st, +extern void xattrs_acls_get(struct tar_stat_info *st,
@ -1544,8 +1284,9 @@
+ char const *file_name, char typeflag); + char const *file_name, char typeflag);
+extern void xattrs_xattrs_set(struct tar_stat_info const *st, +extern void xattrs_xattrs_set(struct tar_stat_info const *st,
+ char const *file_name, char typeflag); + char const *file_name, char typeflag);
diff -up tar-1.17/src/extract.c.xattrs tar-1.17/src/extract.c
--- tar-1.17/src/extract.c.xattrs 2007-06-08 10:14:42.000000000 +0200 --- tar-1.17/src/extract.c.xattrs 2007-06-08 10:14:42.000000000 +0200
+++ tar-1.17/src/extract.c 2007-06-27 17:10:56.000000000 +0200 +++ tar-1.17/src/extract.c 2007-12-10 15:31:54.000000000 +0100
@@ -69,6 +69,13 @@ struct delayed_set_stat @@ -69,6 +69,13 @@ struct delayed_set_stat
mode_t invert_permissions; mode_t invert_permissions;
enum permstatus permstatus; enum permstatus permstatus;
@ -1665,8 +1406,9 @@
set_stat (source, &st1, NULL, 0, 0, SYMTYPE); set_stat (source, &st1, NULL, 0, 0, SYMTYPE);
valid_source = source; valid_source = source;
} }
diff -up tar-1.17/src/tar.h.xattrs tar-1.17/src/tar.h
--- tar-1.17/src/tar.h.xattrs 2007-06-01 12:17:10.000000000 +0200 --- tar-1.17/src/tar.h.xattrs 2007-06-01 12:17:10.000000000 +0200
+++ tar-1.17/src/tar.h 2007-06-27 17:10:56.000000000 +0200 +++ tar-1.17/src/tar.h 2007-12-10 15:31:54.000000000 +0100
@@ -276,6 +276,14 @@ struct xheader @@ -276,6 +276,14 @@ struct xheader
uintmax_t string_length; uintmax_t string_length;
}; };

8
tar.1
View File

@ -357,7 +357,9 @@ delete from the archive (not for use on mag tapes!)
change to directory DIR change to directory DIR
.TP .TP
.B -f, --file [HOSTNAME:]F .B -f, --file [HOSTNAME:]F
use archive file or device F (default "-", meaning stdin/stdout) Use archive file or device F (default "-", meaning stdin/stdout).
Note that "/dev/stdout" is not equivalent to "-". Using "/dev/stdout"
explicitly can lead to corrupted archive, especially when coupled with "-v".
.TP .TP
.B -j, --bzip2 .B -j, --bzip2
filter archive through bzip2, use to decompress .bz2 files filter archive through bzip2, use to decompress .bz2 files
@ -399,7 +401,9 @@ number of links recorded in the archive
print directory names while reading the archive print directory names while reading the archive
.TP .TP
.B -f, --file [HOSTNAME:]F .B -f, --file [HOSTNAME:]F
use archive file or device F (default "-", meaning stdin/stdout) Use archive file or device F (default "-", meaning stdin/stdout).
Note that "/dev/stdout" is not equivalent to "-". Using "/dev/stdout"
explicitly can lead to corrupted archive, especially when coupled with "-v".
.TP .TP
.B -F, --info-script F --new-volume-script F .B -F, --info-script F --new-volume-script F
run script at end of each tape (implies \fI--multi-volume\fR) run script at end of each tape (implies \fI--multi-volume\fR)

View File

@ -2,7 +2,7 @@ Summary: A GNU file archiving program
Name: tar Name: tar
Epoch: 2 Epoch: 2
Version: 1.17 Version: 1.17
Release: 4%{?dist} Release: 5%{?dist}
License: GPLv2+ License: GPLv2+
Group: Applications/Archiving Group: Applications/Archiving
URL: http://www.gnu.org/software/tar/ URL: http://www.gnu.org/software/tar/
@ -16,6 +16,7 @@ Patch4: tar-1.17-xattrs.patch
Patch5: tar-1.17-wildcards.patch Patch5: tar-1.17-wildcards.patch
Patch6: tar-1.17-dot_dot_vuln.patch Patch6: tar-1.17-dot_dot_vuln.patch
Patch7: tar-1.17-safer_name_suffix.patch Patch7: tar-1.17-safer_name_suffix.patch
Patch8: tar-1.17-xattrs-conf.patch
Prereq: info Prereq: info
BuildRequires: autoconf automake gzip texinfo gettext libacl-devel libselinux-devel gawk BuildRequires: autoconf automake gzip texinfo gettext libacl-devel libselinux-devel gawk
Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
@ -43,6 +44,7 @@ the rmt package.
%patch5 -p1 -b .wildcards %patch5 -p1 -b .wildcards
%patch6 -p1 -b .dot_dot_vuln %patch6 -p1 -b .dot_dot_vuln
%patch7 -p1 -b .safer_name_suffix %patch7 -p1 -b .safer_name_suffix
%patch8 -p1 -b .xattrs-conf
%build %build
%configure --bindir=/bin --libexecdir=/sbin %configure --bindir=/bin --libexecdir=/sbin
@ -93,6 +95,15 @@ fi
%{_infodir}/tar.info* %{_infodir}/tar.info*
%changelog %changelog
* Wed Dec 12 2007 Radek Brich <rbrich@redhat.com> 2:1.17-5
- fix (non)detection of xattrs
- move configure stuff from -xattrs patch to -xattrs-conf,
so the original patch could be easily read
- fix -xattrs patch to work with zero length files and show
warnings when xattrs not available (fixes by James Antill)
- possible corruption (#408621) - add warning to man page
for now, may be actually fixed later, depending on upstream
* Tue Oct 23 2007 Radek Brich <rbrich@redhat.com> 2:1.17-4 * Tue Oct 23 2007 Radek Brich <rbrich@redhat.com> 2:1.17-4
- upstream patch for CVE-2007-4476 - upstream patch for CVE-2007-4476
(tar stack crashing in safer_name_suffix) (tar stack crashing in safer_name_suffix)