Commit 12c9844c authored by Joe Tsai's avatar Joe Tsai Committed by Joe Tsai

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: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 04262986
...@@ -363,8 +363,13 @@ func parsePAX(r io.Reader) (map[string]string, error) { ...@@ -363,8 +363,13 @@ func parsePAX(r io.Reader) (map[string]string, error) {
sparseMap.WriteString(value) sparseMap.WriteString(value)
sparseMap.Write([]byte{','}) sparseMap.Write([]byte{','})
} else { } else {
// Normal key. Set the value in the headers map. // According to PAX specification, a value is stored only if it is
headers[keyStr] = value // non-empty. Otherwise, the key is deleted.
if len(value) > 0 {
headers[key] = value
} else {
delete(headers, key)
}
} }
} }
if sparseMap.Len() != 0 { if sparseMap.Len() != 0 {
......
...@@ -1072,6 +1072,8 @@ func TestParsePAX(t *testing.T) { ...@@ -1072,6 +1072,8 @@ func TestParsePAX(t *testing.T) {
map[string]string{"GNU.sparse.map": "0,1,2,3"}, true}, map[string]string{"GNU.sparse.map": "0,1,2,3"}, true},
{"13 key1=haha\n13 key2=nana\n13 key3=kaka\n", {"13 key1=haha\n13 key2=nana\n13 key3=kaka\n",
map[string]string{"key1": "haha", "key2": "nana", "key3": "kaka"}, true}, 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 { for i, v := range vectors {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment