mirror of
https://github.com/golang/go
synced 2024-11-25 10:38:00 -07:00
compress/flate: Fixed two panics on bad data
I used just enough of the data provided by Matt in Issue 5915 to trigger issue 5915. As luck would have it, using slightly less of it triggered issue 5962. Fixes #5915. Fixes #5962. R=golang-dev, bradfitz CC=golang-dev https://golang.org/cl/12288043
This commit is contained in:
parent
17d803d251
commit
df1eeeba4a
@ -24,3 +24,26 @@ func TestUncompressedSource(t *testing.T) {
|
|||||||
t.Errorf("output[0] = %x, want 0x11", output[0])
|
t.Errorf("output[0] = %x, want 0x11", output[0])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The following test should not panic.
|
||||||
|
func TestIssue5915(t *testing.T) {
|
||||||
|
bits := []int{4, 0, 0, 6, 4, 3, 2, 3, 3, 4, 4, 5, 0, 0, 0, 0, 5, 5, 6,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 6, 0, 11, 0, 8, 0, 6, 6, 10, 8}
|
||||||
|
h := new(huffmanDecoder)
|
||||||
|
ok := h.init(bits)
|
||||||
|
if ok == true {
|
||||||
|
t.Fatalf("Given sequence of bits is bad, and should not succeed.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The following test should not panic.
|
||||||
|
func TestIssue5962(t *testing.T) {
|
||||||
|
bits := []int{4, 0, 0, 6, 4, 3, 2, 3, 3, 4, 4, 5, 0, 0, 0, 0,
|
||||||
|
5, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11}
|
||||||
|
h := new(huffmanDecoder)
|
||||||
|
ok := h.init(bits)
|
||||||
|
if ok == true {
|
||||||
|
t.Fatalf("Given sequence of bits is bad, and should not succeed.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -125,6 +125,9 @@ func (h *huffmanDecoder) init(bits []int) bool {
|
|||||||
if i == huffmanChunkBits+1 {
|
if i == huffmanChunkBits+1 {
|
||||||
// create link tables
|
// create link tables
|
||||||
link := code >> 1
|
link := code >> 1
|
||||||
|
if huffmanNumChunks < link {
|
||||||
|
return false
|
||||||
|
}
|
||||||
h.links = make([][]uint32, huffmanNumChunks-link)
|
h.links = make([][]uint32, huffmanNumChunks-link)
|
||||||
for j := uint(link); j < huffmanNumChunks; j++ {
|
for j := uint(link); j < huffmanNumChunks; j++ {
|
||||||
reverse := int(reverseByte[j>>8]) | int(reverseByte[j&0xff])<<8
|
reverse := int(reverseByte[j>>8]) | int(reverseByte[j&0xff])<<8
|
||||||
@ -154,7 +157,11 @@ func (h *huffmanDecoder) init(bits []int) bool {
|
|||||||
h.chunks[off] = chunk
|
h.chunks[off] = chunk
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
linktab := h.links[h.chunks[reverse&(huffmanNumChunks-1)]>>huffmanValueShift]
|
value := h.chunks[reverse&(huffmanNumChunks-1)] >> huffmanValueShift
|
||||||
|
if value >= uint32(len(h.links)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
linktab := h.links[value]
|
||||||
reverse >>= huffmanChunkBits
|
reverse >>= huffmanChunkBits
|
||||||
for off := reverse; off < numLinks; off += 1 << uint(n-huffmanChunkBits) {
|
for off := reverse; off < numLinks; off += 1 << uint(n-huffmanChunkBits) {
|
||||||
linktab[off] = chunk
|
linktab[off] = chunk
|
||||||
|
Loading…
Reference in New Issue
Block a user