Merge branch 'cb/merge-recursive-fix'
[gitweb.git] / patch-delta.c
index affd4f673d15657306acb74f2446d636a34c4fa5..ed9db81fa82c812c9ffa07f5a40540dbb15da0d3 100644 (file)
@@ -9,11 +9,10 @@
  * published by the Free Software Foundation.
  */
 
-#include <stdlib.h>
-#include <string.h>
+#include "git-compat-util.h"
 #include "delta.h"
 
-void *patch_delta(void *src_buf, unsigned long src_size,
+void *patch_delta(const void *src_buf, unsigned long src_size,
                  const void *delta_buf, unsigned long delta_size,
                  unsigned long *dst_size)
 {
@@ -25,7 +24,7 @@ void *patch_delta(void *src_buf, unsigned long src_size,
                return NULL;
 
        data = delta_buf;
-       top = delta_buf + delta_size;
+       top = (const unsigned char *) delta_buf + delta_size;
 
        /* make sure the orig file size matches what we expect */
        size = get_delta_hdr_size(&data, top);
@@ -34,9 +33,7 @@ void *patch_delta(void *src_buf, unsigned long src_size,
 
        /* now the result size */
        size = get_delta_hdr_size(&data, top);
-       dst_buf = malloc(size + 1);
-       if (!dst_buf)
-               return NULL;
+       dst_buf = xmalloc(size + 1);
        dst_buf[size] = 0;
 
        out = dst_buf;
@@ -55,13 +52,13 @@ void *patch_delta(void *src_buf, unsigned long src_size,
                        if (cp_off + cp_size < cp_size ||
                            cp_off + cp_size > src_size ||
                            cp_size > size)
-                               goto bad;
-                       memcpy(out, src_buf + cp_off, cp_size);
+                               break;
+                       memcpy(out, (char *) src_buf + cp_off, cp_size);
                        out += cp_size;
                        size -= cp_size;
                } else if (cmd) {
                        if (cmd > size)
-                               goto bad;
+                               break;
                        memcpy(out, data, cmd);
                        out += cmd;
                        data += cmd;
@@ -72,12 +69,14 @@ void *patch_delta(void *src_buf, unsigned long src_size,
                         * extensions. In the mean time we must fail when
                         * encountering them (might be data corruption).
                         */
+                       error("unexpected delta opcode 0");
                        goto bad;
                }
        }
 
        /* sanity check */
        if (data != top || size != 0) {
+               error("delta replay has gone wild");
                bad:
                free(dst_buf);
                return NULL;