From f684f3dc434f9199ceee175c07d28e8b2b0f28dc Mon Sep 17 00:00:00 2001 From: Alexander Yastrebov Date: Sat, 4 Feb 2023 14:52:55 +0000 Subject: [PATCH] image/jpeg: return io.ErrUnexpectedEOF on truncated data MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Decoder calls fill from readFull, ignore and readByte and readByte did not check returned io.EOF. This change moves io.EOF translation inside fill. name old speed new speed delta DecodeBaseline-8 67.4MB/s ± 0% 67.3MB/s ± 0% -0.20% (p=0.000 n=16+19) DecodeProgressive-8 43.7MB/s ± 0% 43.6MB/s ± 0% -0.06% (p=0.013 n=17+19) Fixes #56724 Change-Id: Ia0d5cc561f3c2050e25ec3f2b5e6866c3b4941c7 GitHub-Last-Rev: 470154373bc1452dffc5293d9a840e972749a76d GitHub-Pull-Request: golang/go#56863 Reviewed-on: https://go-review.googlesource.com/c/go/+/452335 Run-TryBot: Rob Pike Reviewed-by: Nigel Tao Reviewed-by: Nigel Tao (INACTIVE; USE @golang.org INSTEAD) Reviewed-by: Dmitri Shuralyov TryBot-Result: Gopher Robot --- src/image/jpeg/huffman.go | 2 +- src/image/jpeg/reader.go | 11 ++++------- src/image/jpeg/reader_test.go | 14 ++++++++++++++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/image/jpeg/huffman.go b/src/image/jpeg/huffman.go index 95aaf71e2f..72444369ab 100644 --- a/src/image/jpeg/huffman.go +++ b/src/image/jpeg/huffman.go @@ -49,7 +49,7 @@ func (d *decoder) ensureNBits(n int32) error { for { c, err := d.readByteStuffedByte() if err != nil { - if err == io.EOF { + if err == io.ErrUnexpectedEOF { return errShortHuffmanData } return err diff --git a/src/image/jpeg/reader.go b/src/image/jpeg/reader.go index b34072396c..61f2b4020d 100644 --- a/src/image/jpeg/reader.go +++ b/src/image/jpeg/reader.go @@ -164,7 +164,10 @@ func (d *decoder) fill() error { n, err := d.r.Read(d.bytes.buf[d.bytes.j:]) d.bytes.j += n if n > 0 { - err = nil + return nil + } + if err == io.EOF { + err = io.ErrUnexpectedEOF } return err } @@ -261,9 +264,6 @@ func (d *decoder) readFull(p []byte) error { break } if err := d.fill(); err != nil { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } return err } } @@ -291,9 +291,6 @@ func (d *decoder) ignore(n int) error { break } if err := d.fill(); err != nil { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } return err } } diff --git a/src/image/jpeg/reader_test.go b/src/image/jpeg/reader_test.go index 02a2eb6509..cdac2dd756 100644 --- a/src/image/jpeg/reader_test.go +++ b/src/image/jpeg/reader_test.go @@ -490,6 +490,20 @@ func TestExtraneousData(t *testing.T) { } } +func TestIssue56724(t *testing.T) { + b, err := os.ReadFile("../testdata/video-001.jpeg") + if err != nil { + t.Fatal(err) + } + + b = b[:24] // truncate image data + + _, err = Decode(bytes.NewReader(b)) + if err != io.ErrUnexpectedEOF { + t.Errorf("got: %v, want: %v", err, io.ErrUnexpectedEOF) + } +} + func benchmarkDecode(b *testing.B, filename string) { data, err := os.ReadFile(filename) if err != nil { -- 2.48.1