commit b29656e27eca86259a4fc9099e9b5b31433e0065 from: Stefan Sperling date: Fri Mar 16 22:05:12 2018 UTC set obj->size of packed deltified objects to object's actual size 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);