if (ctx->literal_bytes > ctx->block_size) {
*result = ctx->literal_bytes - ctx->block_size;
ctx->literal_bytes -= *result;
- ctx->buffer_start += *result;
+ /* Advance buffer. */
+ if (*result >= buffer_size(ctx))
+ ctx->buffer_start = ctx->buffer_end = 0;
+ else
+ ctx->buffer_start += *result;
} else
*result = 0;
ctx->buffer_end -= ctx->buffer_start;
ctx->buffer_start = 0;
}
- memcpy(ctx->buffer + ctx->buffer_end, buf, len);
+
+ /* Copy len bytes from tail of buffer. */
+ memcpy(ctx->buffer + ctx->buffer_end, buf + buflen - len, len);
ctx->buffer_end += len;
assert(buffer_size(ctx) <= ctx->block_size);
}