]> Cypherpunks repositories - gostls13.git/commitdiff
archive/tar: reapply Header.Size to regFileReader after merging
authorJoe Tsai <joetsai@digital-static.net>
Fri, 2 Sep 2016 21:37:35 +0000 (14:37 -0700)
committerJoe Tsai <thebrokentoaster@gmail.com>
Fri, 2 Sep 2016 21:58:53 +0000 (21:58 +0000)
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>
src/archive/tar/reader.go
src/archive/tar/reader_test.go
src/archive/tar/testdata/pax-pos-size-file.tar [new file with mode: 0644]

index b8b1652b2b450545b4bf390c57e227dd2aa1a9af..fa1c48adeb610ebb66b552f46638edafddaf0d81 100644 (file)
@@ -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
                        }
index 3de5299bacfc16916a42da3ee910de54cf74cdfa..9ffc8d6459b46e2153355c8b4b4df39c0d50d9f8 100644 (file)
@@ -237,6 +237,23 @@ var untarTests = []*untarTest{
                file: "testdata/pax-bad-mtime-file.tar",
                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 (file)
index 0000000..aed9a8a
Binary files /dev/null and b/src/archive/tar/testdata/pax-pos-size-file.tar differ