/* Make sure we have a copy of the last block_size bytes.
* First, copy down the old data. */
if (buffer_size(ctx)) {
- memmove(ctx->buffer, ctx->buffer + ctx->buffer_start,
- buffer_size(ctx));
- ctx->buffer_end -= ctx->buffer_start;
- ctx->buffer_start = 0;
}
if (crcmatch >= 0) {
/* Now save any literal bytes we'll need in future. */
len = ctx->literal_bytes - buffer_size(ctx);
+
+ /* Move down old data if we don't have room. */
+ if (ctx->buffer_end + len > ctx->block_size) {
+ memmove(ctx->buffer, ctx->buffer + ctx->buffer_start,
+ buffer_size(ctx));
+ ctx->buffer_end -= ctx->buffer_start;
+ ctx->buffer_start = 0;
+ }
memcpy(ctx->buffer + ctx->buffer_end, buf, len);
ctx->buffer_end += len;
assert(buffer_size(ctx) <= ctx->block_size);