]> Cypherpunks repositories - gostls13.git/commitdiff
image/jpeg: return io.ErrUnexpectedEOF on truncated data
authorAlexander Yastrebov <yastrebov.alex@gmail.com>
Sat, 4 Feb 2023 14:52:55 +0000 (14:52 +0000)
committerNigel Tao <nigeltao@golang.org>
Fri, 24 Feb 2023 00:03:48 +0000 (00:03 +0000)
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 <r@golang.org>
Reviewed-by: Nigel Tao <nigeltao@golang.org>
Reviewed-by: Nigel Tao (INACTIVE; USE @golang.org INSTEAD) <nigeltao@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/image/jpeg/huffman.go
src/image/jpeg/reader.go
src/image/jpeg/reader_test.go

index 95aaf71e2f36cc2f52887d6facb6b144f1246c15..72444369ab3e112d55bf678254a7305dab59ef12 100644 (file)
@@ -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
index b34072396cbefaf464b7525f179315a1d142424b..61f2b4020d5d8de1f987df900fa56d837d30c292 100644 (file)
@@ -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
                }
        }
index 02a2eb6509bc4772a441a721d357b29d732d3eb5..cdac2dd7563523b208a94856fc48fbb5cda0c653 100644 (file)
@@ -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 {