From: Bdale Garbee Date: Wed, 10 Nov 2010 22:42:51 +0000 (-0700) Subject: Merge branch 'dfsg-orig' into dfsg-debian X-Git-Tag: debian/1.25-1~4 X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=cc5892ba8cbe46ac2f5ad3758293cebdb7003319;hp=-c;p=debian%2Ftar Merge branch 'dfsg-orig' into dfsg-debian --- cc5892ba8cbe46ac2f5ad3758293cebdb7003319 diff --combined src/list.c index fabe8b38,a70f0d38..68f51150 --- a/src/list.c +++ b/src/list.c @@@ -75,6 -75,66 +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); + } + + 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 +195,8 @@@ continue; } } - + transform_stat_info (current_header->header.typeflag, + ¤t_stat_info); (*do_something) (); continue; @@@ -157,17 -218,9 +218,17 @@@ read_header_auto); if (status == HEADER_ZERO_BLOCK) break; + /* + * According to POSIX tar specs, this is wrong, but on the web + * there are some tar specs that can trigger this, and some tar + * implementations create tars according to that spec. For now, + * let's not be pedantic about issuing the warning. + */ +#if 0 WARNOPT (WARN_ALONE_ZERO_BLOCK, (0, 0, _("A lone zero block at %s"), STRINGIFY_BIGINT (current_block_ordinal (), buf))); +#endif break; } status = prev_status; @@@ -503,47 -556,6 +564,6 @@@ read_header (union block **return_block } } - 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 @@@ -580,7 -592,9 +600,9 @@@ decode_header (union block *header, str else format = USTAR_FORMAT; } - else if (strcmp (header->header.magic, OLDGNU_MAGIC) == 0) + else if (strcmp (header->buffer + offsetof (struct posix_header, magic), + OLDGNU_MAGIC) + == 0) format = hbits ? OLDGNU_FORMAT : GNU_FORMAT; else format = V7_FORMAT; @@@ -663,23 -677,9 +685,9 @@@ || 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