[tar] fix xattrs patch, use upstream version of stripcomponents patch
Ondrej Vasik
ovasik at fedoraproject.org
Wed Oct 27 10:46:06 UTC 2010
commit ef1451d533671313a0e03c779432257e1e3472f7
Author: Ondřej Vašík <ovasik at redhat.com>
Date: Wed Oct 27 12:46:31 2010 +0200
fix xattrs patch, use upstream version of stripcomponents patch
tar-1.23-stripcomponents.patch | 191 ------------------------------
tar-1.24-stripcomponents.patch | 252 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 252 insertions(+), 191 deletions(-)
---
diff --git a/tar-1.24-stripcomponents.patch b/tar-1.24-stripcomponents.patch
new file mode 100644
index 0000000..5acb3f9
--- /dev/null
+++ b/tar-1.24-stripcomponents.patch
@@ -0,0 +1,252 @@
+From 28e91b48f680a6fab90ee39145123647345f385f Mon Sep 17 00:00:00 2001
+From: Sergey Poznyakoff <gray at gnu.org.ua>
+Date: Tue, 26 Oct 2010 14:47:16 +0000
+Subject: Make sure name matching occurs before name transformation.
+
+The commit 9c194c99 altered that order.
+
+* src/list.c (transform_stat_info): New function. Split off from
+decode_header.
+(read_and): Call transform_stat_info right before do_something,
+and after deciding if we should proceed with this member name,
+so that name matching occurs before name transformation.
+
+* tests/extrac17.at: New file.
+* tests/Makefile.am (TESTSUITE_AT): Add extrac17.at
+* tests/testsuite.at: Include extrac17.at.
+---
+diff --git a/src/list.c b/src/list.c
+index d15653d..e1e06ca 100644
+--- a/src/list.c
++++ b/src/list.c
+@@ -75,6 +75,66 @@ base64_init (void)
+ base64_map[(int) base_64_digits[i]] = i;
+ }
+
++static char *
++decode_xform (char *file_name, void *data)
++{
++ int type = *(int*)data;
++
++ switch (type)
++ {
++ case XFORM_SYMLINK:
++ /* FIXME: It is not quite clear how and to which extent are the symbolic
++ links subject to filename transformation. In the absence of another
++ solution, symbolic links are exempt from component stripping and
++ name suffix normalization, but subject to filename transformation
++ proper. */
++ return file_name;
++
++ case XFORM_LINK:
++ file_name = safer_name_suffix (file_name, true, absolute_names_option);
++ break;
++
++ case XFORM_REGFILE:
++ file_name = safer_name_suffix (file_name, false, absolute_names_option);
++ break;
++ }
++
++ if (strip_name_components)
++ {
++ size_t prefix_len = stripped_prefix_len (file_name,
++ strip_name_components);
++ if (prefix_len == (size_t) -1)
++ prefix_len = strlen (file_name);
++ file_name += prefix_len;
++ }
++ return file_name;
++}
++
++static bool
++transform_member_name (char **pinput, int type)
++{
++ return transform_name_fp (pinput, type, decode_xform, &type);
++}
++
++static void
++transform_stat_info (int typeflag, struct tar_stat_info *stat_info)
++{
++ if (typeflag == GNUTYPE_VOLHDR)
++ /* Name transformations don't apply to volume headers. */
++ return;
++
++ transform_member_name (&stat_info->file_name, XFORM_REGFILE);
++ switch (typeflag)
++ {
++ case SYMTYPE:
++ transform_member_name (&stat_info->link_name, XFORM_SYMLINK);
++ break;
++
++ case LNKTYPE:
++ transform_member_name (&stat_info->link_name, XFORM_LINK);
++ }
++}
++
+ /* Main loop for reading an archive. */
+ void
+ read_and (void (*do_something) (void))
+@@ -135,7 +195,8 @@ read_and (void (*do_something) (void))
+ continue;
+ }
+ }
+-
++ transform_stat_info (current_header->header.typeflag,
++ ¤t_stat_info);
+ (*do_something) ();
+ continue;
+
+@@ -495,47 +556,6 @@ read_header (union block **return_block, struct tar_stat_info *info,
+ }
+ }
+
+-static char *
+-decode_xform (char *file_name, void *data)
+-{
+- int type = *(int*)data;
+-
+- switch (type)
+- {
+- case XFORM_SYMLINK:
+- /* FIXME: It is not quite clear how and to which extent are the symbolic
+- links subject to filename transformation. In the absence of another
+- solution, symbolic links are exempt from component stripping and
+- name suffix normalization, but subject to filename transformation
+- proper. */
+- return file_name;
+-
+- case XFORM_LINK:
+- file_name = safer_name_suffix (file_name, true, absolute_names_option);
+- break;
+-
+- case XFORM_REGFILE:
+- file_name = safer_name_suffix (file_name, false, absolute_names_option);
+- break;
+- }
+-
+- if (strip_name_components)
+- {
+- size_t prefix_len = stripped_prefix_len (file_name,
+- strip_name_components);
+- if (prefix_len == (size_t) -1)
+- prefix_len = strlen (file_name);
+- file_name += prefix_len;
+- }
+- return file_name;
+-}
+-
+-static bool
+-transform_member_name (char **pinput, int type)
+-{
+- return transform_name_fp (pinput, type, decode_xform, &type);
+-}
+-
+ #define ISOCTAL(c) ((c)>='0'&&(c)<='7')
+
+ /* Decode things from a file HEADER block into STAT_INFO, also setting
+@@ -655,23 +675,9 @@ decode_header (union block *header, struct tar_stat_info *stat_info,
+ || stat_info->dumpdir)
+ stat_info->is_dumpdir = true;
+ }
+-
+- if (header->header.typeflag == GNUTYPE_VOLHDR)
+- /* Name transformations don't apply to volume headers. */
+- return;
+-
+- transform_member_name (&stat_info->file_name, XFORM_REGFILE);
+- switch (header->header.typeflag)
+- {
+- case SYMTYPE:
+- transform_member_name (&stat_info->link_name, XFORM_SYMLINK);
+- break;
+-
+- case LNKTYPE:
+- transform_member_name (&stat_info->link_name, XFORM_LINK);
+- }
+ }
+
++
+ /* Convert buffer at WHERE0 of size DIGS from external format to
+ uintmax_t. DIGS must be positive. If TYPE is nonnull, the data
+ are of type TYPE. The buffer must represent a value in the range
+diff --git a/tests/Makefile.am b/tests/Makefile.am
+index b71e83c..dd375f3 100644
+--- a/tests/Makefile.am
++++ b/tests/Makefile.am
+@@ -83,6 +83,7 @@ TESTSUITE_AT = \
+ extrac14.at\
+ extrac15.at\
+ extrac16.at\
++ extrac17.at\
+ filerem01.at\
+ filerem02.at\
+ gzip.at\
+diff --git a/tests/extrac17.at b/tests/extrac17.at
+new file mode 100644
+index 0000000..952c073
+--- a/dev/null
++++ b/tests/extrac17.at
+@@ -0,0 +1,49 @@
++# Process this file with autom4te to create testsuite. -*- Autotest -*-
++#
++# Test suite for GNU tar.
++# Copyright (C) 2010 Free Software Foundation, Inc.
++#
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 3, or (at your option)
++# any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program. If not, see <http://www.gnu.org/licenses/>.
++
++AT_SETUP([name matching/transformation ordering])
++AT_KEYWORDS([extract extrac17])
++
++# Description: Tar 1.24 changed the ordering of name matching and
++# name transformation so that the former saw already transformed
++# file names (see commit 9c194c99 and exclude06.at). This reverted
++# ordering made it impossible to match file names in certain cases.
++# In particular, the testcase below would not extract anything.
++#
++# Reported-by: "Gabor Z. Papp" <gzp at papp.hu>
++# References: <x6r5fd9jye at gzp>, <20101026175126.29028 at Pirx.gnu.org.ua>
++# http://lists.gnu.org/archive/html/bug-tar/2010-10/msg00047.html
++
++AT_TAR_CHECK([
++mkdir dir dir/subdir1 dir/subdir2 out
++genfile --file dir/subdir1/file1
++genfile --file dir/subdir2/file2
++
++tar cf dir.tar dir
++
++tar -x -v -f dir.tar -C out --strip-components=2 dir/subdir1/
++],
++[0],
++[dir/subdir1/file1
++])
++
++AT_CLEANUP
++
++
++
++
+diff --git a/tests/testsuite.at b/tests/testsuite.at
+index 40f0e41..9aaafff 100644
+--- a/tests/testsuite.at
++++ b/tests/testsuite.at
+@@ -155,6 +155,7 @@ m4_include([extrac13.at])
+ m4_include([extrac14.at])
+ m4_include([extrac15.at])
+ m4_include([extrac16.at])
++m4_include([extrac17.at])
+
+ m4_include([label01.at])
+ m4_include([label02.at])
+--
+cgit v0.8.3.2
More information about the scm-commits
mailing list