1
0
mirror of https://github.com/golang/go synced 2024-11-18 09:54:57 -07:00

archive/tar: fix parsePAX to be POSIX.1-2001 compliant

Relevant PAX specification:
<<<
If the <value> field is zero length, it shall delete any header
block field, previously entered extended header value, or
global extended header value of the same name.
>>>

We don't delete global extender headers since the Reader doesn't
even support global headers (which the specification admits was
a controversial feature).

Change-Id: I2125a5c907b23a3dc439507ca90fa5dc47d474a9
Reviewed-on: https://go-review.googlesource.com/31440
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Joe Tsai 2016-10-18 16:57:02 -07:00 committed by Joe Tsai
parent 04262986a0
commit 12c9844cc6
2 changed files with 9 additions and 2 deletions

View File

@ -363,8 +363,13 @@ func parsePAX(r io.Reader) (map[string]string, error) {
sparseMap.WriteString(value)
sparseMap.Write([]byte{','})
} else {
// Normal key. Set the value in the headers map.
headers[keyStr] = value
// According to PAX specification, a value is stored only if it is
// non-empty. Otherwise, the key is deleted.
if len(value) > 0 {
headers[key] = value
} else {
delete(headers, key)
}
}
}
if sparseMap.Len() != 0 {

View File

@ -1072,6 +1072,8 @@ func TestParsePAX(t *testing.T) {
map[string]string{"GNU.sparse.map": "0,1,2,3"}, true},
{"13 key1=haha\n13 key2=nana\n13 key3=kaka\n",
map[string]string{"key1": "haha", "key2": "nana", "key3": "kaka"}, true},
{"13 key1=val1\n13 key2=val2\n8 key1=\n",
map[string]string{"key2": "val2"}, true},
}
for i, v := range vectors {