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>
for {
c, err := d.readByteStuffedByte()
if err != nil {
- if err == io.EOF {
+ if err == io.ErrUnexpectedEOF {
return errShortHuffmanData
}
return err
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
}
break
}
if err := d.fill(); err != nil {
- if err == io.EOF {
- err = io.ErrUnexpectedEOF
- }
return err
}
}
break
}
if err := d.fill(); err != nil {
- if err == io.EOF {
- err = io.ErrUnexpectedEOF
- }
return err
}
}
}
}
+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 {