From: David Symonds Date: Thu, 8 Nov 2012 21:50:10 +0000 (+1100) Subject: archive/tar: accept binary format when reading numeric header fields. X-Git-Tag: go1.1rc2~1914 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=86b9e3e2b4aebd2fe80099e7c9ff8c0122fc77e4;p=gostls13.git archive/tar: accept binary format when reading numeric header fields. Fixes #4358. R=golang-dev, r CC=golang-dev https://golang.org/cl/6840043 --- diff --git a/src/pkg/archive/tar/reader.go b/src/pkg/archive/tar/reader.go index 1b40af812a..ad825c6be0 100644 --- a/src/pkg/archive/tar/reader.go +++ b/src/pkg/archive/tar/reader.go @@ -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:] diff --git a/src/pkg/archive/tar/tar_test.go b/src/pkg/archive/tar/tar_test.go index a509f3c00a..7b190b6a8b 100644 --- a/src/pkg/archive/tar/tar_test.go +++ b/src/pkg/archive/tar/tar_test.go @@ -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(), }