X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fcrcsync%2Fcrcsync.c;h=2301bc103c1fce4952dbb14cd88057416d62339c;hp=87f513ea90cc74576b2f5854ccd68431f8ed5e65;hb=9fc013b29af595852c1cc53fdb365a06dd5e7d49;hpb=4df5a75fd90bfcd42dedb3bfa83e85b57fd9f63c diff --git a/ccan/crcsync/crcsync.c b/ccan/crcsync/crcsync.c index 87f513ea..2301bc10 100644 --- a/ccan/crcsync/crcsync.c +++ b/ccan/crcsync/crcsync.c @@ -192,7 +192,11 @@ size_t crc_read_block(struct crc_context *ctx, long *result, 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; @@ -206,7 +210,9 @@ size_t crc_read_block(struct crc_context *ctx, long *result, 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); }