From: Alexander Yastrebov Date: Sat, 4 Feb 2023 14:52:55 +0000 (+0000) Subject: image/jpeg: return io.ErrUnexpectedEOF on truncated data X-Git-Tag: go1.21rc1~1491 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=f684f3dc434f9199ceee175c07d28e8b2b0f28dc;p=gostls13.git image/jpeg: return io.ErrUnexpectedEOF on truncated data 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 --- 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 {