* NEWS: Remove support for mangled names.

* doc/tar.texi (verbose tutorial): Likewise.
* src/Makefile.am (tar_SOURCES): Remove mangle.c.
* src/common.h (extract_mangle): Remove decl.
* src/extract.c (extract_mangle_wrapper): Remove.
(prepare_to_extract): Remove support for mangled names.
* src/list.c (read_and, print_header): Likewise.
* src/mangle.c: Remove.
* src/tar.h (GNUTYPE_NAMES): Remove.
This commit is contained in:
Paul Eggert
2006-11-30 06:39:29 +00:00
parent 409bddf38c
commit 49ea4c5057
9 changed files with 19 additions and 155 deletions

View File

@@ -1,5 +1,15 @@
2006-11-29 Paul Eggert <eggert@cs.ucla.edu>
* NEWS: Remove support for mangled names.
* doc/tar.texi (verbose tutorial): Likewise.
* src/Makefile.am (tar_SOURCES): Remove mangle.c.
* src/common.h (extract_mangle): Remove decl.
* src/extract.c (extract_mangle_wrapper): Remove.
(prepare_to_extract): Remove support for mangled names.
* src/list.c (read_and, print_header): Likewise.
* src/mangle.c: Remove.
* src/tar.h (GNUTYPE_NAMES): Remove.
Port to latest gnulib. There were a lot of changes, so the
simplest way to get this up and running was to switch to coreutils
bootstrap procedure. I noticed one feature missing after this

8
NEWS
View File

@@ -1,6 +1,14 @@
GNU tar NEWS - User visible changes.
Please send GNU tar bug reports to <bug-tar@gnu.org>
* Support for reading ustar type 'N' header logical records has been removed.
This GNU extension was generated only by very old versions of GNU 'tar'.
Unfortunately its implementation had security holes; see
<http://archives.neohapsis.com/archives/fulldisclosure/2006-11/0344.html>.
We don't expect that any tar archives in practical use have type 'N'
records, but if you have one and you trust its contents, you can
decode it with GNU tar 1.16 or earlier.
version 1.16 - Sergey Poznyakoff, 2006-10-21
* After creating an archive, tar exits with code 1 if some files were

View File

@@ -1000,12 +1000,6 @@ Encountered only at the beginning of a multi-volume archive
from the previous volume. The number @var{n} gives the offset where
the original file was split.
@item --Mangled file names--
This archive member contains @dfn{mangled file names} declarations,
a special member type that was used by early versions of @GNUTAR{}.
You probably will never encounter this, unless you are reading a very
old archive.
@item unknown file type @var{c}
An archive member of unknown type. @var{c} is the type character from
the archive header. If you encounter such a message, it means that

View File

@@ -30,7 +30,6 @@ tar_SOURCES = \
xheader.c\
incremen.c\
list.c\
mangle.c\
misc.c\
names.c\
sparse.c\

View File

@@ -546,10 +546,6 @@ enum read_header tar_checksum (union block *header, bool silent);
void skip_file (off_t size);
void skip_member (void);
/* Module mangle.c. */
void extract_mangle (void);
/* Module misc.c. */
void assign_string (char **dest, const char *src);

View File

@@ -1023,13 +1023,6 @@ extract_fifo (char *file_name, int typeflag)
}
#endif
static int
extract_mangle_wrapper (char *file_name, int typeflag)
{
extract_mangle ();
return 0;
}
static int
extract_volhdr (char *file_name, int typeflag)
{
@@ -1121,10 +1114,6 @@ prepare_to_extract (char const *file_name, int typeflag, tar_extractor_t *fun)
*fun = extract_volhdr;
break;
case GNUTYPE_NAMES:
*fun = extract_mangle_wrapper;
break;
case GNUTYPE_MULTIVOL:
ERROR ((0, 0,
_("%s: Cannot extract -- file is continued from another volume"),

View File

@@ -107,7 +107,6 @@ read_and (void (*do_something) (void))
{
case GNUTYPE_VOLHDR:
case GNUTYPE_MULTIVOL:
case GNUTYPE_NAMES:
break;
case DIRTYPE:
@@ -1047,10 +1046,6 @@ print_header (struct tar_stat_info *st, off_t block_ordinal)
modes[0] = 'M';
break;
case GNUTYPE_NAMES:
modes[0] = 'N';
break;
case GNUTYPE_LONGNAME:
case GNUTYPE_LONGLINK:
modes[0] = 'L';
@@ -1234,10 +1229,6 @@ print_header (struct tar_stat_info *st, off_t block_ordinal)
uintbuf));
fprintf (stdlis, _("--Continued at byte %s--\n"), size);
break;
case GNUTYPE_NAMES:
fprintf (stdlis, _("--Mangled file names--\n"));
break;
}
}
fflush (stdlis);

View File

@@ -1,121 +0,0 @@
/* Encode long filenames for GNU tar.
Copyright 1988, 92, 94, 96, 97, 99, 2000 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 2, 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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
#include <system.h>
#include "common.h"
#include <quotearg.h>
struct mangled
{
struct mangled *next;
int type;
char mangled[NAME_FIELD_SIZE];
char *linked_to;
char normal[1];
};
/* Extract a GNUTYPE_NAMES record contents. It seems that such are
not produced anymore by GNU tar, but we leave the reading code
around nevertheless, for salvaging old tapes. */
void
extract_mangle (void)
{
off_t size = current_stat_info.stat.st_size;
char *buffer = xmalloc ((size_t) (size + 1));
char *copy = buffer;
char *cursor = buffer;
if (size != (size_t) size || size == (size_t) -1)
xalloc_die ();
buffer[size] = '\0';
while (size > 0)
{
union block *block = find_next_block ();
size_t available;
if (!block)
{
ERROR ((0, 0, _("Unexpected EOF in mangled names")));
return;
}
available = available_space_after (block);
if (available > size)
available = size;
memcpy (copy, block->buffer, available);
copy += available;
size -= available;
set_next_block_after ((union block *) (block->buffer + available - 1));
}
while (*cursor)
{
char *next_cursor;
char *name;
char *name_end;
next_cursor = strchr (cursor, '\n');
*next_cursor++ = '\0';
if (!strncmp (cursor, "Rename ", 7))
{
name = cursor + 7;
name_end = strchr (name, ' ');
while (strncmp (name_end, " to ", 4))
{
name_end++;
name_end = strchr (name_end, ' ');
}
*name_end = '\0';
if (next_cursor[-2] == '/')
next_cursor[-2] = '\0';
unquote_string (name_end + 4);
if (rename (name, name_end + 4))
ERROR ((0, errno, _("%s: Cannot rename to %s"),
quotearg_colon (name), quote_n (1, name_end + 4)));
else if (verbose_option)
WARN ((0, 0, _("Renamed %s to %s"), name, name_end + 4));
}
#ifdef HAVE_SYMLINK
else if (!strncmp (cursor, "Symlink ", 8))
{
name = cursor + 8;
name_end = strchr (name, ' ');
while (strncmp (name_end, " to ", 4))
{
name_end++;
name_end = strchr (name_end, ' ');
}
*name_end = '\0';
unquote_string (name);
unquote_string (name_end + 4);
if (symlink (name, name_end + 4)
&& (unlink (name_end + 4) || symlink (name, name_end + 4)))
ERROR ((0, errno, _("%s: Cannot symlink to %s"),
quotearg_colon (name), quote_n (1, name_end + 4)));
else if (verbose_option)
WARN ((0, 0, _("Symlinked %s to %s"), name, name_end + 4));
}
#endif
else
ERROR ((0, 0, _("Unknown demangling command %s"), cursor));
cursor = next_cursor;
}
}

View File

@@ -165,6 +165,7 @@ struct oldgnu_header
'A' Solaris Access Control List
'E' Solaris Extended Attribute File
'I' Inode only, as in 'star'
'N' Obsolete GNU tar, for file names that do not fit into the main header.
'X' POSIX 1003.1-2001 eXtended (VU version) */
/* This is a dir entry that contains the names of files that were in the
@@ -180,9 +181,6 @@ struct oldgnu_header
/* This is the continuation of a file that began on another volume. */
#define GNUTYPE_MULTIVOL 'M'
/* For storing filenames that do not fit into the main header. */
#define GNUTYPE_NAMES 'N'
/* This is for sparse files. */
#define GNUTYPE_SPARSE 'S'