commit - 65cf1e801564154e05771cdf87c20fa50cf7a7af
commit + b29656e27eca86259a4fc9099e9b5b31433e0065
blob - 94fda1c82fa2d7d311a3d61327877d216a308125
blob + f28e5f73c740eaf73d8a41a888a8f0de42c8d69e
--- lib/delta.c
+++ lib/delta.c
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);
err = copy_from_base(base_file, offset, len,
memstream ? memstream : outfile);
if (err == NULL) {
- outsize += len;
+ *outsize += len;
if (remain > 0) {
p++;
remain--;
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
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
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;
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
}
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);
} 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;
if (accum_file)
fclose(accum_file);
rewind(outfile);
+ if (err == NULL)
+ *result_size = accum_size;
return err;
}
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
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);