Slight cleanup for crcsync.c
authorRusty Russell <rusty@rustcorp.com.au>
Tue, 17 Feb 2009 09:16:33 +0000 (19:46 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Tue, 17 Feb 2009 09:16:33 +0000 (19:46 +1030)
ccan/crcsync/crcsync.c

index cb768806f6e03e829293f624ea06db540fe02e32..6c251f1ff967d1c1a49a9a42592f50926e1223c0 100644 (file)
@@ -170,10 +170,6 @@ size_t crc_read_block(struct crc_context *ctx, long *result,
        /* 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) {
@@ -202,6 +198,14 @@ size_t crc_read_block(struct crc_context *ctx, long *result,
 
                /* 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);