aboutsummaryrefslogtreecommitdiff
path: root/src/archive/tar/reader_test.go
diff options
context:
space:
mode:
authorJoe Tsai <joetsai@digital-static.net>2015-10-01 01:04:24 -0700
committerBrad Fitzpatrick <bradfitz@golang.org>2015-10-06 17:49:05 +0000
commite4add8d569d3152a461dbdf6e086dd60c8ca6c27 (patch)
tree82bd7547da45cb82cc9ff16e36d37fbbb0252248 /src/archive/tar/reader_test.go
parent281eabe46f638139b8d85d87a359880dc0f8ea81 (diff)
downloadgo-e4add8d569d3152a461dbdf6e086dd60c8ca6c27.tar.xz
archive/tar: fix numeric overflow issues in readGNUSparseMap0x1
Motivation: * The logic to verify the numEntries can overflow and incorrectly pass, allowing a malicious file to allocate arbitrary memory. * The use of strconv.ParseInt does not set the integer precision to 64bit, causing this code to work incorrectly on 32bit machines. Change-Id: I1b1571a750a84f2dde97cc329ed04fe2342aaa60 Reviewed-on: https://go-review.googlesource.com/15173 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/archive/tar/reader_test.go')
-rw-r--r--src/archive/tar/reader_test.go87
1 files changed, 71 insertions, 16 deletions
diff --git a/src/archive/tar/reader_test.go b/src/archive/tar/reader_test.go
index 604d13f57b..4a6d1a9e9f 100644
--- a/src/archive/tar/reader_test.go
+++ b/src/archive/tar/reader_test.go
@@ -680,23 +680,78 @@ func TestSparseFileReader(t *testing.T) {
}
func TestReadGNUSparseMap0x1(t *testing.T) {
- headers := map[string]string{
- paxGNUSparseNumBlocks: "4",
- paxGNUSparseMap: "0,5,10,5,20,5,30,5",
- }
- expected := []sparseEntry{
- {offset: 0, numBytes: 5},
- {offset: 10, numBytes: 5},
- {offset: 20, numBytes: 5},
- {offset: 30, numBytes: 5},
- }
+ const (
+ maxUint = ^uint(0)
+ maxInt = int(maxUint >> 1)
+ )
+ var (
+ big1 = fmt.Sprintf("%d", int64(maxInt))
+ big2 = fmt.Sprintf("%d", (int64(maxInt)/2)+1)
+ big3 = fmt.Sprintf("%d", (int64(maxInt) / 3))
+ )
- sp, err := readGNUSparseMap0x1(headers)
- if err != nil {
- t.Errorf("Unexpected error: %v", err)
- }
- if !reflect.DeepEqual(sp, expected) {
- t.Errorf("Incorrect sparse map: got %v, wanted %v", sp, expected)
+ var vectors = []struct {
+ extHdrs map[string]string // Input data
+ sparseMap []sparseEntry // Expected sparse entries to be outputted
+ err error // Expected errors that may be raised
+ }{{
+ extHdrs: map[string]string{paxGNUSparseNumBlocks: "-4"},
+ err: ErrHeader,
+ }, {
+ extHdrs: map[string]string{paxGNUSparseNumBlocks: "fee "},
+ err: ErrHeader,
+ }, {
+ extHdrs: map[string]string{
+ paxGNUSparseNumBlocks: big1,
+ paxGNUSparseMap: "0,5,10,5,20,5,30,5",
+ },
+ err: ErrHeader,
+ }, {
+ extHdrs: map[string]string{
+ paxGNUSparseNumBlocks: big2,
+ paxGNUSparseMap: "0,5,10,5,20,5,30,5",
+ },
+ err: ErrHeader,
+ }, {
+ extHdrs: map[string]string{
+ paxGNUSparseNumBlocks: big3,
+ paxGNUSparseMap: "0,5,10,5,20,5,30,5",
+ },
+ err: ErrHeader,
+ }, {
+ extHdrs: map[string]string{
+ paxGNUSparseNumBlocks: "4",
+ paxGNUSparseMap: "0.5,5,10,5,20,5,30,5",
+ },
+ err: ErrHeader,
+ }, {
+ extHdrs: map[string]string{
+ paxGNUSparseNumBlocks: "4",
+ paxGNUSparseMap: "0,5.5,10,5,20,5,30,5",
+ },
+ err: ErrHeader,
+ }, {
+ extHdrs: map[string]string{
+ paxGNUSparseNumBlocks: "4",
+ paxGNUSparseMap: "0,fewafewa.5,fewafw,5,20,5,30,5",
+ },
+ err: ErrHeader,
+ }, {
+ extHdrs: map[string]string{
+ paxGNUSparseNumBlocks: "4",
+ paxGNUSparseMap: "0,5,10,5,20,5,30,5",
+ },
+ sparseMap: []sparseEntry{{0, 5}, {10, 5}, {20, 5}, {30, 5}},
+ }}
+
+ for i, v := range vectors {
+ sp, err := readGNUSparseMap0x1(v.extHdrs)
+ if !reflect.DeepEqual(sp, v.sparseMap) && !(len(sp) == 0 && len(v.sparseMap) == 0) {
+ t.Errorf("test %d, readGNUSparseMap0x1(...): got %v, want %v", i, sp, v.sparseMap)
+ }
+ if err != v.err {
+ t.Errorf("test %d, unexpected error: got %v, want %v", i, err, v.err)
+ }
}
}