Commit 2f98bac3 authored by Nigel Tao's avatar Nigel Tao

image/jpeg: don't assume that an ensureNBits failure implies that we can

call unreadByteStuffedByte.

If ensureNBits was due to an io.EOF that was translated to
jpeg.errShortHuffmanData, then we may have read no bytes, so there is no
byte-stuffed-byte to unread.

Fixes #10387

Change-Id: I39a3842590c6cef2aa48943288d52f603338b44d
Reviewed-on: https://go-review.googlesource.com/8841Reviewed-by: 's avatarRob Pike <r@golang.org>
parent 8b27d28e
......@@ -170,7 +170,7 @@ func (d *decoder) fill() error {
// can happen when expecting to read a 0xff 0x00 byte-stuffed byte.
func (d *decoder) unreadByteStuffedByte() {
if d.bytes.nUnreadable == 0 {
panic("jpeg: unreadByteStuffedByte call cannot be fulfilled")
return
}
d.bytes.i -= d.bytes.nUnreadable
d.bytes.nUnreadable = 0
......@@ -242,12 +242,7 @@ func (d *decoder) readByteStuffedByte() (x byte, err error) {
// stuffing.
func (d *decoder) readFull(p []byte) error {
// Unread the overshot bytes, if any.
if d.bytes.nUnreadable != 0 {
if d.bits.n >= 8 {
d.unreadByteStuffedByte()
}
d.bytes.nUnreadable = 0
}
d.unreadByteStuffedByte()
for {
n := copy(p, d.bytes.buf[d.bytes.i:d.bytes.j])
......@@ -269,12 +264,7 @@ func (d *decoder) readFull(p []byte) error {
// ignore ignores the next n bytes.
func (d *decoder) ignore(n int) error {
// Unread the overshot bytes, if any.
if d.bytes.nUnreadable != 0 {
if d.bits.n >= 8 {
d.unreadByteStuffedByte()
}
d.bytes.nUnreadable = 0
}
d.unreadByteStuffedByte()
for {
m := d.bytes.j - d.bytes.i
......
......@@ -186,6 +186,26 @@ func pixString(pix []byte, stride, x, y int) string {
return s.String()
}
func TestTruncatedSOSDataDoesntPanic(t *testing.T) {
b, err := ioutil.ReadFile("../testdata/video-005.gray.q50.jpeg")
if err != nil {
t.Fatal(err)
}
sosMarker := []byte{0xff, 0xda}
i := bytes.Index(b, sosMarker)
if i < 0 {
t.Fatal("SOS marker not found")
}
i += len(sosMarker)
j := i + 10
if j > len(b) {
j = len(b)
}
for ; i < j; i++ {
Decode(bytes.NewReader(b[:i]))
}
}
func TestExtraneousData(t *testing.T) {
// Encode a 1x1 red image.
src := image.NewRGBA(image.Rect(0, 0, 1, 1))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment