diff options
| author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2020-04-22 14:22:44 +0200 | 
|---|---|---|
| committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2020-04-22 14:22:44 +0200 | 
| commit | c6b65ee8a9a57d51956ee462fa1d61fd90d61f40 (patch) | |
| tree | 84465ce5c60eae3ee2a53a40fe3c4ced0c690778 | |
| parent | 9a20cc2f627c3fa086b109dd1830bf45519fcb55 (diff) | |
Skip PAX global headers
Tar archives can contain set two kinds of PAX headers:
 - local headers that modify the attributes of the next file
 - global headers that set defaults for all files
The later is used "... not widely used", according to tar(5)
and has been deliberately not implemented.
Some programs (e.g. git-archive) *do* generate them (in the case
of git, it stores the commit hash).
This commit adds a code path that skips a PAX global header entirely
and resumes tar parsing, instead of erroneusly reporting it as an
entry.
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
| -rw-r--r-- | include/tar.h | 1 | ||||
| -rw-r--r-- | lib/tar/read_header.c | 5 | 
2 files changed, 6 insertions, 0 deletions
| diff --git a/include/tar.h b/include/tar.h index def36be..af3c9ab 100644 --- a/include/tar.h +++ b/include/tar.h @@ -105,6 +105,7 @@ typedef struct {  #define TAR_TYPE_GNU_SPARSE 'S'  #define TAR_TYPE_PAX 'x' +#define TAR_TYPE_PAX_GLOBAL 'g'  #define TAR_MAGIC "ustar"  #define TAR_VERSION "00" diff --git a/lib/tar/read_header.c b/lib/tar/read_header.c index 2918d09..1f20334 100644 --- a/lib/tar/read_header.c +++ b/lib/tar/read_header.c @@ -222,6 +222,11 @@ int read_header(FILE *fp, tar_header_decoded_t *out)  				goto fail;  			set_by_pax |= PAX_NAME;  			continue; +		case TAR_TYPE_PAX_GLOBAL: +			if (read_number(hdr.size, sizeof(hdr.size), &pax_size)) +				goto fail; +			skip_entry(fp, pax_size); +			continue;  		case TAR_TYPE_PAX:  			clear_header(out);  			if (read_number(hdr.size, sizeof(hdr.size), &pax_size)) | 
