1
0
mirror of https://github.com/golang/go synced 2024-09-30 17:38:33 -06:00

internal/zstd: fix copyFromWindow when match extends past window

For #62513
This commit is contained in:
Alexander Yastrebov 2023-09-25 21:44:44 +02:00
parent 4a310877f2
commit 4dd16fcfa8
2 changed files with 18 additions and 26 deletions

View File

@ -388,46 +388,38 @@ func (r *Reader) copyFromWindow(rbr *reverseBitReader, offset, match uint32) err
return rbr.makeError("invalid zero offset")
}
// Offset may point into the buffer or the window and
// match may extend past the end of the initial buffer.
// |--r.window--|--r.buffer--|
// |<-----offset------|
// |------match----------->|
bufferOffset := uint32(0)
lenBlock := uint32(len(r.buffer))
if lenBlock < offset {
lenWindow := r.window.len()
windowOffset := offset - lenBlock
if windowOffset > lenWindow {
copy := offset - lenBlock
if copy > lenWindow {
return rbr.makeError("offset past window")
}
from := lenWindow - windowOffset
if from+match <= lenWindow {
r.buffer = r.window.appendTo(r.buffer, from, from+match)
return nil
windowOffset := lenWindow - copy
if copy > match {
copy = match
}
r.buffer = r.window.appendTo(r.buffer, from, lenWindow)
copied := lenWindow - from
offset -= copied
match -= copied
if offset == 0 && match > 0 {
return rbr.makeError("invalid offset")
}
}
from := lenBlock - offset
if offset >= match {
r.buffer = append(r.buffer, r.buffer[from:from+match]...)
return nil
r.buffer = r.window.appendTo(r.buffer, windowOffset, windowOffset+copy)
match -= copy
} else {
bufferOffset = lenBlock - offset
}
// We are being asked to copy data that we are adding to the
// buffer in the same copy.
for match > 0 {
var copy uint32
if offset >= match {
copy := uint32(len(r.buffer)) - bufferOffset
if copy > match {
copy = match
} else {
copy = offset
}
r.buffer = append(r.buffer, r.buffer[from:from+copy]...)
r.buffer = append(r.buffer, r.buffer[bufferOffset:bufferOffset+copy]...)
match -= copy
from += copy
}
return nil
}

Binary file not shown.