Commit Diff


commit - 0e22967e43602d4c52a8d102e30107f8c4da765a
commit + 06e5fc98c0fca4d47edc5ba2d0e7e9d0addcafdd
blob - 41af9356c9c8a63448df12b4f5c977e9eb233dc5
blob + c7ae922fdd4a145746c22771f63ff2e6ba588bb8
--- lib/delta.c
+++ lib/delta.c
@@ -252,7 +252,7 @@ got_delta_apply(FILE *base_file, const uint8_t *delta_
 
 	/* Decode and execute copy instructions from the delta stream. */
 	err = next_delta_byte(&p, &remain);
-	while (err == NULL) {
+	while (err == NULL && remain > 0) {
 		if (*p & GOT_DELTA_BASE_COPY) {
 			off_t offset = 0;
 			size_t len = 0;
@@ -260,8 +260,13 @@ got_delta_apply(FILE *base_file, const uint8_t *delta_
 			if (err)
 				break;
 			err = copy_from_base(base_file, offset, len, outfile);
-			if (err == NULL)
+			if (err == NULL) {
 				outsize += len;
+				if (remain > 0) {
+					p++;
+					remain--;
+				}
+			}
 		} else {
 			size_t len = (size_t)*p;
 			if (len == 0) {
@@ -270,19 +275,11 @@ got_delta_apply(FILE *base_file, const uint8_t *delta_
 			}
 			err = next_delta_byte(&p, &remain);
 			if (err)
-				return err;
+				break;
 			err = copy_from_delta(&p, &remain, len, outfile);
 			if (err == NULL)
 				outsize += len;
 		}
-
-		if (err == NULL) {
-			if (remain == 0)
-				break;
-			/* Fetch the next instruction. */
-			p++;
-			remain--;
-		}
 	}
 
 	if (outsize != result_size)