diff options
| author | Junio C Hamano <gitster@pobox.com> | 2024-08-23 09:02:33 -0700 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2024-08-23 09:02:33 -0700 |
| commit | 1b6b2bfae582e1e5a9b9ad2ef15985f69ade0fce (patch) | |
| tree | e92ce38ee06174dcff67406f37a9a5f2c6566053 /read-cache.c | |
| parent | The seventh batch (diff) | |
| parent | builtin/diff: free symmetric diff members (diff) | |
| download | git-1b6b2bfae582e1e5a9b9ad2ef15985f69ade0fce.tar.gz git-1b6b2bfae582e1e5a9b9ad2ef15985f69ade0fce.zip | |
Merge branch 'ps/leakfixes-part-4'
More leak fixes.
* ps/leakfixes-part-4: (22 commits)
builtin/diff: free symmetric diff members
diff: free state populated via options
builtin/log: fix leak when showing converted blob contents
userdiff: fix leaking memory for configured diff drivers
builtin/format-patch: fix various trivial memory leaks
diff: fix leak when parsing invalid ignore regex option
unpack-trees: clear index when not propagating it
sequencer: release todo list on error paths
merge-ort: unconditionally release attributes index
builtin/fast-export: plug leaking tag names
builtin/fast-export: fix leaking diff options
builtin/fast-import: plug trivial memory leaks
builtin/notes: fix leaking `struct notes_tree` when merging notes
builtin/rebase: fix leaking `commit.gpgsign` value
config: fix leaking comment character config
submodule-config: fix leaking name entry when traversing submodules
read-cache: fix leaking hashfile when writing index fails
bulk-checkin: fix leaking state TODO
object-name: fix leaking symlink paths in object context
object-file: fix memory leak when reading corrupted headers
...
Diffstat (limited to 'read-cache.c')
| -rw-r--r-- | read-cache.c | 114 |
1 files changed, 38 insertions, 76 deletions
diff --git a/read-cache.c b/read-cache.c index 1f67bb755b..36821fe5b5 100644 --- a/read-cache.c +++ b/read-cache.c @@ -2840,8 +2840,9 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile, int csum_fsync_flag; int ieot_entries = 1; struct index_entry_offset_table *ieot = NULL; - int nr, nr_threads; struct repository *r = istate->repo; + struct strbuf sb = STRBUF_INIT; + int nr, nr_threads, ret; f = hashfd(tempfile->fd, tempfile->filename.buf); @@ -2962,8 +2963,8 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile, strbuf_release(&previous_name_buf); if (err) { - free(ieot); - goto cleanup; + ret = err; + goto out; } offset = hashfile_total(f); @@ -2985,26 +2986,20 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile, * index. */ if (ieot) { - struct strbuf sb = STRBUF_INIT; + strbuf_reset(&sb); write_ieot_extension(&sb, ieot); err = write_index_ext_header(f, eoie_c, CACHE_EXT_INDEXENTRYOFFSETTABLE, sb.len) < 0; hashwrite(f, sb.buf, sb.len); - strbuf_release(&sb); - free(ieot); - /* - * NEEDSWORK: write_index_ext_header() never returns a failure, - * and this part may want to be simplified. - */ if (err) { - err = -1; - goto cleanup; + ret = -1; + goto out; } } if (write_extensions & WRITE_SPLIT_INDEX_EXTENSION && istate->split_index) { - struct strbuf sb = STRBUF_INIT; + strbuf_reset(&sb); if (istate->sparse_index) die(_("cannot write split index for a sparse index")); @@ -3013,95 +3008,65 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile, write_index_ext_header(f, eoie_c, CACHE_EXT_LINK, sb.len) < 0; hashwrite(f, sb.buf, sb.len); - strbuf_release(&sb); - /* - * NEEDSWORK: write_link_extension() never returns a failure, - * and this part may want to be simplified. - */ if (err) { - err = -1; - goto cleanup; + ret = -1; + goto out; } } if (write_extensions & WRITE_CACHE_TREE_EXTENSION && !drop_cache_tree && istate->cache_tree) { - struct strbuf sb = STRBUF_INIT; + strbuf_reset(&sb); cache_tree_write(&sb, istate->cache_tree); err = write_index_ext_header(f, eoie_c, CACHE_EXT_TREE, sb.len) < 0; hashwrite(f, sb.buf, sb.len); - strbuf_release(&sb); - /* - * NEEDSWORK: write_index_ext_header() never returns a failure, - * and this part may want to be simplified. - */ if (err) { - err = -1; - goto cleanup; + ret = -1; + goto out; } } if (write_extensions & WRITE_RESOLVE_UNDO_EXTENSION && istate->resolve_undo) { - struct strbuf sb = STRBUF_INIT; + strbuf_reset(&sb); resolve_undo_write(&sb, istate->resolve_undo); err = write_index_ext_header(f, eoie_c, CACHE_EXT_RESOLVE_UNDO, sb.len) < 0; hashwrite(f, sb.buf, sb.len); - strbuf_release(&sb); - /* - * NEEDSWORK: write_index_ext_header() never returns a failure, - * and this part may want to be simplified. - */ if (err) { - err = -1; - goto cleanup; + ret = -1; + goto out; } } if (write_extensions & WRITE_UNTRACKED_CACHE_EXTENSION && istate->untracked) { - struct strbuf sb = STRBUF_INIT; + strbuf_reset(&sb); write_untracked_extension(&sb, istate->untracked); err = write_index_ext_header(f, eoie_c, CACHE_EXT_UNTRACKED, sb.len) < 0; hashwrite(f, sb.buf, sb.len); - strbuf_release(&sb); - /* - * NEEDSWORK: write_index_ext_header() never returns a failure, - * and this part may want to be simplified. - */ if (err) { - err = -1; - goto cleanup; + ret = -1; + goto out; } } if (write_extensions & WRITE_FSMONITOR_EXTENSION && istate->fsmonitor_last_update) { - struct strbuf sb = STRBUF_INIT; + strbuf_reset(&sb); write_fsmonitor_extension(&sb, istate); err = write_index_ext_header(f, eoie_c, CACHE_EXT_FSMONITOR, sb.len) < 0; hashwrite(f, sb.buf, sb.len); - strbuf_release(&sb); - /* - * NEEDSWORK: write_index_ext_header() never returns a failure, - * and this part may want to be simplified. - */ if (err) { - err = -1; - goto cleanup; + ret = -1; + goto out; } } if (istate->sparse_index) { - err = write_index_ext_header(f, eoie_c, CACHE_EXT_SPARSE_DIRECTORIES, 0); - /* - * NEEDSWORK: write_index_ext_header() never returns a failure, - * and this part may want to be simplified. - */ - if (err) { - err = -1; - goto cleanup; + if (write_index_ext_header(f, eoie_c, CACHE_EXT_SPARSE_DIRECTORIES, 0) < 0) { + ret = -1; + goto out; } } @@ -3112,19 +3077,14 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile, * when loading the shared index. */ if (eoie_c) { - struct strbuf sb = STRBUF_INIT; + strbuf_reset(&sb); write_eoie_extension(&sb, eoie_c, offset); err = write_index_ext_header(f, NULL, CACHE_EXT_ENDOFINDEXENTRIES, sb.len) < 0; hashwrite(f, sb.buf, sb.len); - strbuf_release(&sb); - /* - * NEEDSWORK: write_index_ext_header() never returns a failure, - * and this part may want to be simplified. - */ if (err) { - err = -1; - goto cleanup; + ret = -1; + goto out; } } @@ -3137,12 +3097,12 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile, f = NULL; if (close_tempfile_gently(tempfile)) { - err = error(_("could not close '%s'"), get_tempfile_path(tempfile)); - goto cleanup; + ret = error(_("could not close '%s'"), get_tempfile_path(tempfile)); + goto out; } if (stat(get_tempfile_path(tempfile), &st)) { - err = error_errno(_("could not stat '%s'"), get_tempfile_path(tempfile)); - goto cleanup; + ret = -1; + goto out; } istate->timestamp.sec = (unsigned int)st.st_mtime; istate->timestamp.nsec = ST_MTIME_NSEC(st); @@ -3157,12 +3117,14 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile, trace2_data_intmax("index", the_repository, "write/cache_nr", istate->cache_nr); - return 0; + ret = 0; -cleanup: +out: if (f) - discard_hashfile(f); - return err; + free_hashfile(f); + strbuf_release(&sb); + free(ieot); + return ret; } void set_alternate_index_output(const char *name) |
