diff --git a/archive/archive.go b/archive/archive.go index 1c8e115..4537778 100644 --- a/archive/archive.go +++ b/archive/archive.go @@ -128,7 +128,13 @@ func DecompressStream(archive io.Reader) (io.ReadCloser, error) { p := pools.BufioReader32KPool buf := p.Get(archive) bs, err := buf.Peek(10) - if err != nil { + if err != nil && err != io.EOF { + // Note: we'll ignore any io.EOF error because there are some odd + // cases where the layer.tar file will be empty (zero bytes) and + // that results in an io.EOF from the Peek() call. So, in those + // cases we'll just treat it as a non-compressed stream and + // that means just create an empty layer. + // See Issue 18170 return nil, err } diff --git a/archive/archive_test.go b/archive/archive_test.go index 6c54c02..0b5dbb1 100644 --- a/archive/archive_test.go +++ b/archive/archive_test.go @@ -216,11 +216,16 @@ func TestUntarPathWithInvalidDest(t *testing.T) { invalidDestFolder := path.Join(tempFolder, "invalidDest") // Create a src file srcFile := path.Join(tempFolder, "src") - _, err = os.Create(srcFile) + tarFile := path.Join(tempFolder, "src.tar") + os.Create(srcFile) + os.Create(invalidDestFolder) // being a file (not dir) should cause an error + cmd := exec.Command("/bin/sh", "-c", "tar cf "+tarFile+" "+srcFile) + _, err = cmd.CombinedOutput() if err != nil { - t.Fatalf("Fail to create the source file") + t.Fatal(err) } - err = UntarPath(srcFile, invalidDestFolder) + + err = UntarPath(tarFile, invalidDestFolder) if err == nil { t.Fatalf("UntarPath with invalid destination path should throw an error.") }