commit 9feb4ff2689af67633c98892e721ccd407ea1c92 from: Stefan Sperling date: Wed Mar 14 01:37:58 2018 UTC propagate error from delta cache insertion; fixes mem leak commit - bd1223b9e402164e437d56f0fc72d208a4f354c7 commit + 9feb4ff2689af67633c98892e721ccd407ea1c92 blob - 8e741204236a2eac2d5340b57fde5b4e4a7d1eb6 blob + b96fa54031b91ee3b26894533b25f6b0da0f177a --- got/Makefile +++ got/Makefile @@ -7,7 +7,9 @@ SRCS= got.c delta.c error.c fileindex.c object.c path CPPFLAGS = -I${.CURDIR}/../include -I${.CURDIR}/../lib LDADD = -lutil -lz DPADD = ${LIBZ} ${LIBUTIL} -DEBUG = -O0 -g +CC = gcc +DEBUG = -O0 -pg +CPPFLAGS += -DPROFILE CFLAGS += -Werror -Wall -Wstrict-prototypes -Wunused-variable # For now, default to installing binary in ~/bin blob - be95ec2118d5261062ef994e8f8d22a4a399606b blob + 95a3c58b2e1406aa5612b3f0b3bebcce4b204d3e --- got/got.c +++ got/got.c @@ -173,8 +173,10 @@ cmd_checkout(int argc, char *argv[]) argc -= optind; argv += optind; +#ifndef PROFILE if (pledge("stdio rpath wpath cpath flock", NULL) == -1) err(1, "pledge"); +#endif if (argc == 1) { char *cwd, *base, *dotgit; @@ -298,9 +300,10 @@ cmd_log(int argc, char *argv[]) struct got_object *obj; char *repo_path = NULL; +#ifndef PROFILE if (pledge("stdio rpath wpath cpath", NULL) == -1) err(1, "pledge"); - +#endif if (argc == 1) { repo_path = getcwd(NULL, 0); if (repo_path == NULL) blob - d3af74a3fb9e36cb7d3086ac9cb4edb9859644a2 blob + c7bfedc9c04e407c2ebdd3f5ef229347e502e5c9 --- lib/pack.c +++ lib/pack.c @@ -114,7 +114,7 @@ got_packidx_open(struct got_packidx_v2_hdr **packidx, f = fopen(path, "rb"); if (f == NULL) - return got_error(GOT_ERR_BAD_PATH); + return got_error_from_errno(); err = get_packfile_size(&packfile_size, path); if (err) @@ -985,7 +985,7 @@ clear_delta_cache_entry(struct got_delta_cache_entry * entry->delta_len = 0; } -void +const struct got_error * add_delta_cache_entry(struct got_delta_cache *cache, off_t data_offset, uint8_t *delta_buf, size_t delta_len) { @@ -1009,13 +1009,14 @@ add_delta_cache_entry(struct got_delta_cache *cache, o entry = &cache->deltas[i]; entry->delta_buf = calloc(1, delta_len); if (entry->delta_buf == NULL) - return; + return got_error(GOT_ERR_NO_MEM); entry->data_offset = data_offset; - memcpy(entry->delta_buf, delta_buf, delta_len); + entry->delta_buf = delta_buf; entry->delta_len = delta_len; + return NULL; } -void +const struct got_error * cache_delta(off_t data_offset, uint8_t *delta_buf, size_t delta_len, const char *path_packfile, struct got_repository *repo) { @@ -1026,11 +1027,9 @@ cache_delta(off_t data_offset, uint8_t *delta_buf, siz cache = &repo->delta_cache[i]; if (cache->path_packfile == NULL) break; - if (strcmp(cache->path_packfile, path_packfile) == 0) { - add_delta_cache_entry(cache, data_offset, delta_buf, - delta_len); - return; - } + if (strcmp(cache->path_packfile, path_packfile) == 0) + return add_delta_cache_entry(cache, data_offset, + delta_buf, delta_len); } if (i == nitems(repo->delta_cache)) { @@ -1052,8 +1051,8 @@ cache_delta(off_t data_offset, uint8_t *delta_buf, siz cache = &repo->delta_cache[i]; cache->path_packfile = strdup(path_packfile); if (cache->path_packfile == NULL) - return; - add_delta_cache_entry(cache, data_offset, delta_buf, delta_len); + return got_error(GOT_ERR_NO_MEM); + return add_delta_cache_entry(cache, data_offset, delta_buf, delta_len); } void @@ -1129,7 +1128,6 @@ dump_delta_chain(struct got_delta_chain *deltas, FILE uint8_t *delta_buf = NULL; size_t delta_len = 0; FILE *delta_file; - int is_cached = 0; delta_file = fopen(delta->path_packfile, "rb"); if (delta_file == NULL) { @@ -1165,7 +1163,6 @@ dump_delta_chain(struct got_delta_chain *deltas, FILE get_cached_delta(&delta_buf, &delta_len, delta->data_offset, path_packfile, repo); - if (delta_buf == NULL) { if (fseeko(delta_file, delta->data_offset, SEEK_CUR) != 0) { @@ -1181,16 +1178,16 @@ dump_delta_chain(struct got_delta_chain *deltas, FILE if (err) goto done; - cache_delta(delta->data_offset, delta_buf, delta_len, - path_packfile, repo); - } else - is_cached = 1; + err = cache_delta(delta->data_offset, delta_buf, + delta_len, path_packfile, repo); + if (err) + goto done; + } + /* delta_buf is now cached */ err = got_delta_apply(base_file, delta_buf, delta_len, /* Final delta application writes to the output file. */ ++n < deltas->nentries ? accum_file : outfile); - if (!is_cached) - free(delta_buf); if (err) goto done;