From 7410961e758c155389fab3f0391e65320854acbc Mon Sep 17 00:00:00 2001 From: Vincent Batts Date: Mon, 26 Sep 2016 14:51:07 -0400 Subject: [PATCH 1/2] tar/asm: failing test for lack of EOF nils Reported-by: Derek McGowan Signed-off-by: Vincent Batts --- tar/asm/assemble_test.go | 2 ++ tar/asm/testdata/extranils.tar.gz | Bin 0 -> 127 bytes tar/asm/testdata/notenoughnils.tar.gz | Bin 0 -> 91 bytes 3 files changed, 2 insertions(+) create mode 100644 tar/asm/testdata/extranils.tar.gz create mode 100644 tar/asm/testdata/notenoughnils.tar.gz diff --git a/tar/asm/assemble_test.go b/tar/asm/assemble_test.go index c0c7f17..afdce9d 100644 --- a/tar/asm/assemble_test.go +++ b/tar/asm/assemble_test.go @@ -139,6 +139,8 @@ var testCases = []struct { {"./testdata/longlink.tar.gz", "d9f6babe107b7247953dff6b5b5ae31a3a880add", 20480}, {"./testdata/fatlonglink.tar.gz", "8537f03f89aeef537382f8b0bb065d93e03b0be8", 26234880}, {"./testdata/iso-8859.tar.gz", "ddafa51cb03c74ec117ab366ee2240d13bba1ec3", 10240}, + {"./testdata/extranils.tar.gz", "e187b4b3e739deaccc257342f4940f34403dc588", 10648}, + {"./testdata/notenoughnils.tar.gz", "72f93f41efd95290baa5c174c234f5d4c22ce601", 512}, } func TestTarStream(t *testing.T) { diff --git a/tar/asm/testdata/extranils.tar.gz b/tar/asm/testdata/extranils.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..70caf6e6e7641340e6bbe7fa1c36bcf7b19b9533 GIT binary patch literal 127 zcmb2|=HTE?e;LlioLW&*l$e*9Q><5#Sj6!5lr7gG2a(o`+owbx+GCh@O<1uhVXDjZ z_wv(jWtRFC|9l|l|J<@}&Ar~kA8x$){p(H5*XWejd$$%|FY1{!)44b3F~8nxGu@>} cz8d7-{`J;eKbrv#YD$=2`88gep~=7i0Ka=WQvd(} literal 0 HcmV?d00001 diff --git a/tar/asm/testdata/notenoughnils.tar.gz b/tar/asm/testdata/notenoughnils.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..146bb008bbeb2ff6e5fe1232dfc29894f85ed57b GIT binary patch literal 91 zcmV-h0HpsPiwFShZ0T15153-yNoAlhFaQEG6B7_^Xl`l%<{LuzFu-7FWNvO`WM*t+ xXvSb*XlQ6+z@T8jKnGA-T#{I%pukX;lvq+yj89!^Q8B}?0{|>t!}0(E001l6BE0|r literal 0 HcmV?d00001 From 6b59e6942e2c9a03fd4506102adfa082a96b5ace Mon Sep 17 00:00:00 2001 From: Derek McGowan Date: Mon, 26 Sep 2016 14:01:48 -0700 Subject: [PATCH 2/2] archive/tar: fix writing too many raw bytes When an EOF is read, only the part of the header buffer which was read should be accounted for. Signed-off-by: Derek McGowan --- archive/tar/reader.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/archive/tar/reader.go b/archive/tar/reader.go index fdc8ae3..adf3212 100644 --- a/archive/tar/reader.go +++ b/archive/tar/reader.go @@ -608,12 +608,12 @@ func (tr *Reader) readHeader() *Header { header := tr.hdrBuff[:] copy(header, zeroBlock) - if _, tr.err = io.ReadFull(tr.r, header); tr.err != nil { + if n, err := io.ReadFull(tr.r, header); err != nil { + tr.err = err // because it could read some of the block, but reach EOF first if tr.err == io.EOF && tr.RawAccounting { - if _, err := tr.rawBytes.Write(header); err != nil { + if _, err := tr.rawBytes.Write(header[:n]); err != nil { tr.err = err - return nil } } return nil // io.EOF is okay here @@ -626,11 +626,12 @@ func (tr *Reader) readHeader() *Header { // Two blocks of zero bytes marks the end of the archive. if bytes.Equal(header, zeroBlock[0:blockSize]) { - if _, tr.err = io.ReadFull(tr.r, header); tr.err != nil { + if n, err := io.ReadFull(tr.r, header); err != nil { + tr.err = err // because it could read some of the block, but reach EOF first if tr.err == io.EOF && tr.RawAccounting { - if _, tr.err = tr.rawBytes.Write(header); tr.err != nil { - return nil + if _, err := tr.rawBytes.Write(header[:n]); err != nil { + tr.err = err } } return nil // io.EOF is okay here