aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Tsai <joetsai@digital-static.net>2016-09-02 14:37:35 -0700
committerJoe Tsai <thebrokentoaster@gmail.com>2016-09-02 21:58:53 +0000
commit0b84a64da173d811d01a8a59545c22a7e1fd986a (patch)
tree4f4a1fc6b2661c4093e47bb843b2c7b96e27fb00
parent549ca046ffeb1f76833c15059d3a5da301cf1eb3 (diff)
downloadgo-0b84a64da173d811d01a8a59545c22a7e1fd986a.tar.xz
archive/tar: reapply Header.Size to regFileReader after merging
The use of PAX headers can modify the overall file size, thus the formerly created regFileReader may be stale. The relevant PAX specification for this behavior is: <<< Any fields in the preceding optional extended header shall override the associated fields in this header block for this file. >>> Where "optional extended header" refers to the preceding PAX header. Where "this header block" refers to the subsequent USTAR header. Fixes #15573 Fixes #15564 Change-Id: I83b1c3f05a9ca2d3be38647425ad21a9fe450ee2 Reviewed-on: https://go-review.googlesource.com/28418 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
-rw-r--r--src/archive/tar/reader.go11
-rw-r--r--src/archive/tar/reader_test.go17
-rw-r--r--src/archive/tar/testdata/pax-pos-size-file.tarbin0 -> 2560 bytes
3 files changed, 24 insertions, 4 deletions
diff --git a/src/archive/tar/reader.go b/src/archive/tar/reader.go
index b8b1652b2b..fa1c48adeb 100644
--- a/src/archive/tar/reader.go
+++ b/src/archive/tar/reader.go
@@ -175,11 +175,14 @@ loop:
return nil, err
}
- // TODO(dsnet): The extended headers may have updated the size.
- // Thus, we must setup the regFileReader again here.
- //
- // See golang.org/issue/15573
+ // The extended headers may have updated the size.
+ // Thus, setup the regFileReader again after merging PAX headers.
+ if err := tr.handleRegularFile(hdr); err != nil {
+ return nil, err
+ }
+ // Sparse formats rely on being able to read from the logical data
+ // section; there must be a preceding call to handleRegularFile.
if err := tr.handleSparseFile(hdr, rawHdr, extHdrs); err != nil {
return nil, err
}
diff --git a/src/archive/tar/reader_test.go b/src/archive/tar/reader_test.go
index 3de5299bac..9ffc8d6459 100644
--- a/src/archive/tar/reader_test.go
+++ b/src/archive/tar/reader_test.go
@@ -238,6 +238,23 @@ var untarTests = []*untarTest{
err: ErrHeader,
},
{
+ file: "testdata/pax-pos-size-file.tar",
+ headers: []*Header{{
+ Name: "foo",
+ Mode: 0640,
+ Uid: 319973,
+ Gid: 5000,
+ Size: 999,
+ ModTime: time.Unix(1442282516, 0),
+ Typeflag: '0',
+ Uname: "joetsai",
+ Gname: "eng",
+ }},
+ chksums: []string{
+ "0afb597b283fe61b5d4879669a350556",
+ },
+ },
+ {
file: "testdata/nil-uid.tar", // golang.org/issue/5290
headers: []*Header{
{
diff --git a/src/archive/tar/testdata/pax-pos-size-file.tar b/src/archive/tar/testdata/pax-pos-size-file.tar
new file mode 100644
index 0000000000..aed9a8aa48
--- /dev/null
+++ b/src/archive/tar/testdata/pax-pos-size-file.tar
Binary files differ