Skip to content

Commit 1d40a91

Browse files
committed
Check length before copy
1 parent 099f285 commit 1d40a91

File tree

2 files changed

+16
-16
lines changed

2 files changed

+16
-16
lines changed

huff0/decompress.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -763,21 +763,20 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) {
763763
d.bufs.Put(buf)
764764
return nil, errors.New("corruption detected: stream overrun 1")
765765
}
766+
// There must at least be 3 buffers left.
767+
if len(out) < dstEvery*3-bufoff {
768+
d.bufs.Put(buf)
769+
return nil, errors.New("corruption detected: stream overrun 2")
770+
}
766771
//copy(out, buf[0][:])
767772
//copy(out[dstEvery:], buf[1][:])
768773
//copy(out[dstEvery*2:], buf[2][:])
769-
//copy(out[dstEvery*3:], buf[3][:])
770774
*(*[bufoff]byte)(out) = buf[0]
771775
*(*[bufoff]byte)(out[dstEvery:]) = buf[1]
772776
*(*[bufoff]byte)(out[dstEvery*2:]) = buf[2]
773777
*(*[bufoff]byte)(out[dstEvery*3:]) = buf[3]
774778
out = out[bufoff:]
775779
decoded += bufoff * 4
776-
// There must at least be 3 buffers left.
777-
if len(out) < dstEvery*3 {
778-
d.bufs.Put(buf)
779-
return nil, errors.New("corruption detected: stream overrun 2")
780-
}
781780
}
782781
}
783782
if off > 0 {
@@ -1001,6 +1000,12 @@ func (d *Decoder) decompress4X8bitExactly(dst, src []byte) ([]byte, error) {
10011000
d.bufs.Put(buf)
10021001
return nil, errors.New("corruption detected: stream overrun 1")
10031002
}
1003+
// There must at least be 3 buffers left.
1004+
if len(out) < dstEvery*3-bufoff {
1005+
d.bufs.Put(buf)
1006+
return nil, errors.New("corruption detected: stream overrun 2")
1007+
}
1008+
10041009
//copy(out, buf[0][:])
10051010
//copy(out[dstEvery:], buf[1][:])
10061011
//copy(out[dstEvery*2:], buf[2][:])
@@ -1011,11 +1016,6 @@ func (d *Decoder) decompress4X8bitExactly(dst, src []byte) ([]byte, error) {
10111016
*(*[bufoff]byte)(out[dstEvery*3:]) = buf[3]
10121017
out = out[bufoff:]
10131018
decoded += bufoff * 4
1014-
// There must at least be 3 buffers left.
1015-
if len(out) < dstEvery*3 {
1016-
d.bufs.Put(buf)
1017-
return nil, errors.New("corruption detected: stream overrun 2")
1018-
}
10191019
}
10201020
}
10211021
if off > 0 {

huff0/decompress_generic.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,11 @@ func (d *Decoder) Decompress4X(dst, src []byte) ([]byte, error) {
122122
d.bufs.Put(buf)
123123
return nil, errors.New("corruption detected: stream overrun 1")
124124
}
125+
// There must at least be 3 buffers left.
126+
if len(out) < dstEvery*3-bufoff {
127+
d.bufs.Put(buf)
128+
return nil, errors.New("corruption detected: stream overrun 2")
129+
}
125130
//copy(out, buf[0][:])
126131
//copy(out[dstEvery:], buf[1][:])
127132
//copy(out[dstEvery*2:], buf[2][:])
@@ -132,11 +137,6 @@ func (d *Decoder) Decompress4X(dst, src []byte) ([]byte, error) {
132137
*(*[bufoff]byte)(out[dstEvery*3:]) = buf[3]
133138
out = out[bufoff:]
134139
decoded += bufoff * 4
135-
// There must at least be 3 buffers left.
136-
if len(out) < dstEvery*3 {
137-
d.bufs.Put(buf)
138-
return nil, errors.New("corruption detected: stream overrun 2")
139-
}
140140
}
141141
}
142142
if off > 0 {

0 commit comments

Comments
 (0)