]> git.proxmox.com Git - tar.git/blobdiff - sparse-unicode.patch
update to 1.29b-2+pve.1 and buildfiles for pve 5
[tar.git] / sparse-unicode.patch
diff --git a/sparse-unicode.patch b/sparse-unicode.patch
new file mode 100644 (file)
index 0000000..c263a3e
--- /dev/null
@@ -0,0 +1,162 @@
+From 00f928642f7f7f1e7154a47df9cbf37ae70402ea Mon Sep 17 00:00:00 2001
+From: Pavel Raiskup <praiskup@redhat.com>
+Date: Thu, 30 Jun 2016 16:17:29 +0200
+Subject: [PATCH] sparse: fix pax extraction for unicode filenames
+
+Make sure that 'GNU.sparse.name' header has higher priority than
+(for sparse-purposes artificially modified) 'path' pax header.
+
+Historically, the 'GNU.sparse.name' header comes before 'path';
+this caused that modified 'path' header won and that is not what
+we want in sparse "capable" tar implementation.
+
+* src/tar.h (tar_stat_info): New argument sparse_name_done.
+* src/xheader.c (raw_path_decoder): Move here the unconditional
+code from path_decoder.
+(path_decoder): Apply raw_path_decoder only if sparse_path_decoder
+was not yet called.
+(sparse_path_decoder): New wrapper around raw_path_decoder.
+* tests/sparse07.at: New testcase.
+* tests/testsuite.at: Mention new testcase.
+* tests/Makefile.am: Likewise.
+---
+ src/tar.h          |  4 ++++
+ src/xheader.c      | 26 ++++++++++++++++++++++----
+ tests/Makefile.am  |  1 +
+ tests/sparse07.at  | 35 +++++++++++++++++++++++++++++++++++
+ tests/testsuite.at |  1 +
+ 5 files changed, 63 insertions(+), 4 deletions(-)
+ create mode 100644 tests/sparse07.at
+
+diff --git a/src/tar.h b/src/tar.h
+index 07b5bc1..f3e2c43 100644
+--- a/src/tar.h
++++ b/src/tar.h
+@@ -331,6 +331,10 @@ struct tar_stat_info
+   int   real_size_set;      /* True when GNU.sparse.realsize is set in
+                              archived file */
++  bool  sparse_name_done;   /* Set to true if 'GNU.sparse.name' header was
++                               processed pax header parsing.  Following 'path'
++                               header (lower priority) will be ignored. */
++
+   size_t xattr_map_size;   /* Size of the xattr map */
+   struct xattr_array *xattr_map;
+diff --git a/src/xheader.c b/src/xheader.c
+index 8dda580..335ddaf 100644
+--- a/src/xheader.c
++++ b/src/xheader.c
+@@ -1291,14 +1291,32 @@ path_coder (struct tar_stat_info const *st, char const *keyword,
+ }
+ static void
++raw_path_decoder (struct tar_stat_info *st, char const *arg)
++{
++  decode_string (&st->orig_file_name, arg);
++  decode_string (&st->file_name, arg);
++  st->had_trailing_slash = strip_trailing_slashes (st->file_name);
++}
++
++
++static void
+ path_decoder (struct tar_stat_info *st,
+             char const *keyword __attribute__((unused)),
+             char const *arg,
+             size_t size __attribute__((unused)))
+ {
+-  decode_string (&st->orig_file_name, arg);
+-  decode_string (&st->file_name, arg);
+-  st->had_trailing_slash = strip_trailing_slashes (st->file_name);
++  if (! st->sparse_name_done)
++    raw_path_decoder (st, arg);
++}
++
++static void
++sparse_path_decoder (struct tar_stat_info *st,
++                     char const *keyword __attribute__((unused)),
++                     char const *arg,
++                     size_t size __attribute__((unused)))
++{
++  st->sparse_name_done = true;
++  raw_path_decoder (st, arg);
+ }
+ static void
+@@ -1730,7 +1748,7 @@ struct xhdr_tab const xhdr_tab[] = {
+   { "uname",    uname_coder,    uname_decoder,    0, false },
+   /* Sparse file handling */
+-  { "GNU.sparse.name",       path_coder, path_decoder,
++  { "GNU.sparse.name",       path_coder, sparse_path_decoder,
+     XHDR_PROTECTED, false },
+   { "GNU.sparse.major",      sparse_major_coder, sparse_major_decoder,
+     XHDR_PROTECTED, false },
+diff --git a/tests/Makefile.am b/tests/Makefile.am
+index 06f2325..fd38cb4 100644
+--- a/tests/Makefile.am
++++ b/tests/Makefile.am
+@@ -215,6 +215,7 @@ TESTSUITE_AT = \
+  sparse04.at\
+  sparse05.at\
+  sparse06.at\
++ sparse07.at\
+  sparsemv.at\
+  sparsemvp.at\
+  spmvp00.at\
+diff --git a/tests/sparse07.at b/tests/sparse07.at
+new file mode 100644
+index 0000000..8191c00
+--- /dev/null
++++ b/tests/sparse07.at
+@@ -0,0 +1,35 @@
++# Process this file with autom4te to create testsuite. -*- Autotest -*-
++
++# Test suite for GNU tar.
++# Copyright 2016 Free Software Foundation, Inc.
++
++# This file is part of GNU tar.
++
++# GNU tar 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 of the License, or
++# (at your option) any later version.
++
++# GNU tar 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([sparse files with unicode names])
++AT_KEYWORDS([sparse sparse07 unicode])
++
++AT_TAR_CHECK([
++genfile --sparse --file žluť --block-size 512 0 ABCD 1M EFGH 2000K IJKL || AT_SKIP_TEST
++tar -c -f archive --sparse žluť || exit 1
++
++tar tf archive
++],
++[0],
++[\305\276lu\305\245
++],
++[],[],[],[posix, gnu, oldgnu])
++
++AT_CLEANUP
+diff --git a/tests/testsuite.at b/tests/testsuite.at
+index e0525a1..59ace0b 100644
+--- a/tests/testsuite.at
++++ b/tests/testsuite.at
+@@ -387,6 +387,7 @@ m4_include([sparse03.at])
+ m4_include([sparse04.at])
+ m4_include([sparse05.at])
+ m4_include([sparse06.at])
++m4_include([sparse07.at])
+ m4_include([sparsemv.at])
+ m4_include([spmvp00.at])
+ m4_include([spmvp01.at])
+-- 
+2.11.0
+