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:
parent
04262986a0
commit
12c9844cc6
@ -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 {
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user