[PATCH] make patch_delta() error cases a bit more verbose

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxx>

---

diff --git a/Makefile b/Makefile
index 8870349..a0a1018 100644
--- a/Makefile
+++ b/Makefile
@@ -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)
diff --git a/patch-delta.c b/patch-delta.c
index e3a1d42..ed9db81 100644
--- a/patch-delta.c
+++ b/patch-delta.c
@@ -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,
@@ -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;
@@ -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;
@@ -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;
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]