Commit Diff


commit - 65cf1e801564154e05771cdf87c20fa50cf7a7af
commit + b29656e27eca86259a4fc9099e9b5b31433e0065
blob - 94fda1c82fa2d7d311a3d61327877d216a308125
blob + f28e5f73c740eaf73d8a41a888a8f0de42c8d69e
--- lib/delta.c
+++ lib/delta.c
@@ -315,15 +315,17 @@ got_delta_apply_in_mem(uint8_t *base_buf, const uint8_
 
 const struct got_error *
 got_delta_apply(FILE *base_file, const uint8_t *delta_buf,
-    size_t delta_len, FILE *outfile)
+    size_t delta_len, FILE *outfile, size_t *outsize)
 {
 	const struct got_error *err = NULL;
 	uint64_t base_size, result_size;
-	size_t remain, outsize = 0;
+	size_t remain = 0;
 	const uint8_t *p;
 	FILE *memstream = NULL;
 	char *memstream_buf = NULL;
 	size_t memstream_size = 0;
+
+	*outsize = 0;
 
 	if (delta_len < GOT_DELTA_STREAM_LENGTH_MIN)
 		return got_error(GOT_ERR_BAD_DELTA);
@@ -349,7 +351,7 @@ got_delta_apply(FILE *base_file, const uint8_t *delta_
 			err = copy_from_base(base_file, offset, len,
 			    memstream ? memstream : outfile);
 			if (err == NULL) {
-				outsize += len;
+				*outsize += len;
 				if (remain > 0) {
 					p++;
 					remain--;
@@ -367,11 +369,11 @@ got_delta_apply(FILE *base_file, const uint8_t *delta_
 			err = copy_from_delta(&p, &remain, len,
 			    memstream ? memstream : outfile);
 			if (err == NULL)
-				outsize += len;
+				*outsize += len;
 		}
 	}
 
-	if (outsize != result_size)
+	if (*outsize != result_size)
 		err = got_error(GOT_ERR_BAD_DELTA);
 
 	if (memstream != NULL) {
blob - 2d360fffb4e36cf7edb6b21c83237eb7faaa1802
blob + e1098e1de940ff52efdb5088309e86ac591b44d7
--- lib/got_delta_lib.h
+++ lib/got_delta_lib.h
@@ -38,7 +38,7 @@ const struct got_error *got_delta_get_sizes(uint64_t *
 const struct got_error *got_delta_apply_in_mem(uint8_t *, const uint8_t *,
     size_t, uint8_t *, size_t *);
 const struct got_error *got_delta_apply(FILE *, const uint8_t *, size_t,
-    FILE *);
+    FILE *, size_t *);
 
 /*
  * The amount of result data we may keep in RAM while applying deltas.
blob - 8a150ed6a4a8ab40a0192e6d13163ea368733167
blob + 40fa2015c89f8c0224ed85f1148416b42e6a9561
--- lib/object.c
+++ lib/object.c
@@ -625,8 +625,8 @@ got_object_commit_open(struct got_commit_object **comm
 		err = got_packfile_extract_object_to_mem(&buf, &len, obj, repo);
 		if (err)
 			return err;
-		len -= obj->hdrlen;
-		err = parse_commit_object(commit, buf + obj->hdrlen, len);
+		obj->size = len;
+		err = parse_commit_object(commit, buf, len);
 		free(buf);
 	} else {
 		FILE *f;
@@ -701,8 +701,8 @@ got_object_tree_open(struct got_tree_object **tree,
 		err = got_packfile_extract_object_to_mem(&buf, &len, obj, repo);
 		if (err)
 			return err;
-		len -= obj->hdrlen;
-		err = parse_tree_object(tree, repo, buf + obj->hdrlen, len);
+		obj->size = len;
+		err = parse_tree_object(tree, repo, buf, len);
 		free(buf);
 	} else {
 		FILE *f;
blob - a8cbf633e11797b009036d0963079169cbb8ebd0
blob + b9e653bff893a26dfec127374b1cf76741196ac3
--- lib/pack.c
+++ lib/pack.c
@@ -1082,16 +1082,19 @@ get_cached_delta(uint8_t **delta_buf, size_t *delta_le
 }
 
 static const struct got_error *
-dump_delta_chain_to_file(struct got_delta_chain *deltas, FILE *outfile,
-    FILE *packfile, const char *path_packfile, struct got_repository *repo)
+dump_delta_chain_to_file(size_t *result_size, struct got_delta_chain *deltas,
+    FILE *outfile, FILE *packfile, const char *path_packfile,
+    struct got_repository *repo)
 {
 	const struct got_error *err = NULL;
 	struct got_delta *delta;
 	FILE *base_file = NULL, *accum_file = NULL;
 	uint8_t *base_buf = NULL, *accum_buf = NULL;
-	size_t accum_size;
+	size_t accum_size = 0;
 	uint64_t max_size;
 	int n = 0;
+
+	*result_size = 0;
 
 	if (SIMPLEQ_EMPTY(&deltas->entries))
 		return got_error(GOT_ERR_BAD_DELTA_CHAIN);
@@ -1192,7 +1195,8 @@ dump_delta_chain_to_file(struct got_delta_chain *delta
 		} else {
 			err = got_delta_apply(base_file, delta_buf, delta_len,
 			    /* Final delta application writes to output file. */
-			    ++n < deltas->nentries ? accum_file : outfile);
+			    ++n < deltas->nentries ? accum_file : outfile,
+			    &accum_size);
 		}
 		if (err)
 			goto done;
@@ -1226,6 +1230,8 @@ done:
 	if (accum_file)
 		fclose(accum_file);
 	rewind(outfile);
+	if (err == NULL)
+		*result_size = accum_size;
 	return err;
 }
 
@@ -1372,8 +1378,8 @@ got_packfile_extract_object(FILE **f, struct got_objec
 
 		err = got_inflate_to_file(&obj->size, packfile, *f);
 	} else
-		err = dump_delta_chain_to_file(&obj->deltas, *f, packfile,
-		    obj->path_packfile, repo);
+		err = dump_delta_chain_to_file(&obj->size, &obj->deltas, *f,
+		    packfile, obj->path_packfile, repo);
 done:
 	if (packfile)
 		fclose(packfile);
blob - 1567c4357790f8c855326c23f1674ae7c13eff4b
blob + 1486b9cf29e562247e4d0c5854683b917738a4c9
--- regress/delta/delta_test.c
+++ regress/delta/delta_test.c
@@ -77,11 +77,15 @@ delta_apply()
 		rewind(base_file);
 
 		err = got_delta_apply(base_file, dt->delta, dt->delta_len,
-		    result_file);
+		    result_file, &len);
 		fclose(base_file);
 		if (err)
 			break;
 		result_len = strlen(dt->expected);
+		if (result_len != len) {
+			err = got_ferror(result_file, GOT_ERR_BAD_DELTA);
+			break;
+		}
 		n = fread(buf, result_len, 1, result_file);
 		if (n != 1 || strncmp(buf, dt->expected, result_len) != 0) {
 			err = got_ferror(result_file, GOT_ERR_BAD_DELTA);