aboutsummaryrefslogtreecommitdiff
path: root/src/archive/tar/reader.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/archive/tar/reader.go')
-rw-r--r--src/archive/tar/reader.go36
1 files changed, 19 insertions, 17 deletions
diff --git a/src/archive/tar/reader.go b/src/archive/tar/reader.go
index e4e694e0b8..c0d4ea6940 100644
--- a/src/archive/tar/reader.go
+++ b/src/archive/tar/reader.go
@@ -85,12 +85,21 @@ loop:
// Check for PAX/GNU special headers and files.
switch hdr.Typeflag {
- case TypeXHeader:
+ case TypeXHeader, TypeXGlobalHeader:
format.mayOnlyBe(FormatPAX)
paxHdrs, err = parsePAX(tr)
if err != nil {
return nil, err
}
+ if hdr.Typeflag == TypeXGlobalHeader {
+ mergePAX(hdr, paxHdrs)
+ return &Header{
+ Typeflag: hdr.Typeflag,
+ Xattrs: hdr.Xattrs,
+ PAXRecords: hdr.PAXRecords,
+ Format: format,
+ }, nil
+ }
continue loop // This is a meta header affecting the next header
case TypeGNULongName, TypeGNULongLink:
format.mayOnlyBe(FormatGNU)
@@ -230,14 +239,13 @@ func (tr *Reader) readGNUSparsePAXHeaders(hdr *Header) (sparseDatas, error) {
}
}
-// mergePAX merges well known headers according to PAX standard.
-// In general headers with the same name as those found
-// in the header struct overwrite those found in the header
-// struct with higher precision or longer values. Esp. useful
-// for name and linkname fields.
-func mergePAX(hdr *Header, headers map[string]string) (err error) {
- var id64 int64
- for k, v := range headers {
+// mergePAX merges paxHdrs into hdr for all relevant fields of Header.
+func mergePAX(hdr *Header, paxHdrs map[string]string) (err error) {
+ for k, v := range paxHdrs {
+ if v == "" {
+ continue // Keep the original USTAR value
+ }
+ var id64 int64
switch k {
case paxPath:
hdr.Name = v
@@ -273,7 +281,7 @@ func mergePAX(hdr *Header, headers map[string]string) (err error) {
return ErrHeader
}
}
- hdr.PAXRecords = headers
+ hdr.PAXRecords = paxHdrs
return nil
}
@@ -309,13 +317,7 @@ func parsePAX(r io.Reader) (map[string]string, error) {
}
sparseMap = append(sparseMap, value)
default:
- // According to PAX specification, a value is stored only if it is
- // non-empty. Otherwise, the key is deleted.
- if len(value) > 0 {
- paxHdrs[key] = value
- } else {
- delete(paxHdrs, key)
- }
+ paxHdrs[key] = value
}
}
if len(sparseMap) > 0 {