X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fbuffer.c;h=b47b773ee8ea65c151db1fc8293e52ca8e58a433;hb=c3fa22fc8023ad21ad32b13f934c3324756c9236;hp=f419dd7bcb357232ca76f254a78417c0a6794142;hpb=706bd019158e8e1213520b1de521eab83332762d;p=chaz%2Ftar diff --git a/src/buffer.c b/src/buffer.c index f419dd7..b47b773 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -1165,7 +1165,7 @@ read_header0 (struct tar_stat_info *info) enum read_header rc; tar_stat_init (info); - rc = read_header (¤t_header, info, false); + rc = read_header (¤t_header, info, read_header_auto); if (rc == HEADER_SUCCESS) { set_next_block_after (current_header); @@ -1213,17 +1213,42 @@ try_new_volume () { case XGLTYPE: { - if (!read_header0 (&dummy)) - return false; + tar_stat_init (&dummy); + if (read_header (&header, &dummy, read_header_x_global) + != HEADER_SUCCESS_EXTENDED) + { + ERROR ((0, 0, _("This does not look like a tar archive"))); + return false; + } + xheader_decode (&dummy); /* decodes values from the global header */ tar_stat_destroy (&dummy); - if (!real_s_name) - { - /* We have read the extended header of the first member in - this volume. Put it back, so next read_header works as - expected. */ - current_block = record_start; - } + + /* The initial global header must be immediately followed by + an extended PAX header for the first member in this volume. + However, in some cases tar may split volumes in the middle + of a PAX header. This is incorrect, and should be fixed + in the future versions. In the meantime we must be + prepared to correctly list and extract such archives. + + If this happens, the following call to read_header returns + HEADER_FAILURE, which is ignored. + + See also tests/multiv07.at */ + + switch (read_header (&header, &dummy, read_header_auto)) + { + case HEADER_SUCCESS: + set_next_block_after (header); + break; + + case HEADER_FAILURE: + break; + + default: + ERROR ((0, 0, _("This does not look like a tar archive"))); + return false; + } break; }