Skip to content

Commit

Permalink
make patch_delta() error cases a bit more verbose
Browse files Browse the repository at this point in the history
It is especially important to distinguish between a malloc() failure
from all the other cases.  An out of memory condition is much less
worrisome than a compatibility/corruption problem.

Also make test-delta compilable again.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Nicolas Pitre authored and Junio C Hamano committed Dec 18, 2006
1 parent e1bb1d3 commit 57b7315
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 9 deletions.
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -796,8 +796,8 @@ test: all
test-date$X: test-date.c date.o ctype.o
$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) test-date.c date.o ctype.o

test-delta$X: test-delta.c diff-delta.o patch-delta.o
$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $^
test-delta$X: test-delta.o diff-delta.o patch-delta.o $(GITLIBS)
$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)

test-dump-cache-tree$X: dump-cache-tree.o $(GITLIBS)
$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
Expand Down
13 changes: 6 additions & 7 deletions patch-delta.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@
* published by the Free Software Foundation.
*/

#include <stdlib.h>
#include <string.h>
#include "git-compat-util.h"
#include "delta.h"

void *patch_delta(const void *src_buf, unsigned long src_size,
Expand All @@ -34,9 +33,7 @@ void *patch_delta(const 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;
Expand All @@ -55,13 +52,13 @@ void *patch_delta(const 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;
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;
Expand All @@ -72,12 +69,14 @@ void *patch_delta(const 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;
Expand Down

0 comments on commit 57b7315

Please sign in to comment.