]> Cypherpunks repositories - gostls13.git/commitdiff
archive/tar: accept binary format when reading numeric header fields.
authorDavid Symonds <dsymonds@golang.org>
Thu, 8 Nov 2012 21:50:10 +0000 (08:50 +1100)
committerDavid Symonds <dsymonds@golang.org>
Thu, 8 Nov 2012 21:50:10 +0000 (08:50 +1100)
Fixes #4358.

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/6840043

src/pkg/archive/tar/reader.go
src/pkg/archive/tar/tar_test.go

index 1b40af812ae627a267b9331bda7e7a00970ae21c..ad825c6be0b83339d3da43e6c30324718ff9779f 100644 (file)
@@ -72,6 +72,18 @@ func cString(b []byte) string {
 }
 
 func (tr *Reader) octal(b []byte) int64 {
+       // Check for binary format first.
+       if len(b) > 0 && b[0]&0x80 != 0 {
+               var x int64
+               for i, c := range b {
+                       if i == 0 {
+                               c &= 0x7f // ignore signal bit in first byte
+                       }
+                       x = x<<8 | int64(c)
+               }
+               return x
+       }
+
        // Removing leading spaces.
        for len(b) > 0 && b[0] == ' ' {
                b = b[1:]
index a509f3c00af92d791ef1f89c08c3c35d6e6b3366..7b190b6a8b27196e1a5d009a82714064c10a12c8 100644 (file)
@@ -65,6 +65,7 @@ func TestRoundTrip(t *testing.T) {
        tw := NewWriter(&b)
        hdr := &Header{
                Name:    "file.txt",
+               Uid:     1 << 21, // too big for 8 octal digits
                Size:    int64(len(data)),
                ModTime: time.Now(),
        }