Merge branch 'ps/leakfixes-more'

More memory leaks have been plugged.

* ps/leakfixes-more: (29 commits)
  builtin/blame: fix leaking ignore revs files
  builtin/blame: fix leaking prefixed paths
  blame: fix leaking data for blame scoreboards
  line-range: plug leaking find functions
  merge: fix leaking merge bases
  builtin/merge: fix leaking `struct cmdnames` in `get_strategy()`
  sequencer: fix memory leaks in `make_script_with_merges()`
  builtin/clone: plug leaking HEAD ref in `wanted_peer_refs()`
  apply: fix leaking string in `match_fragment()`
  sequencer: fix leaking string buffer in `commit_staged_changes()`
  commit: fix leaking parents when calling `commit_tree_extended()`
  config: fix leaking "core.notesref" variable
  rerere: fix various trivial leaks
  builtin/stash: fix leak in `show_stash()`
  revision: free diff options
  builtin/log: fix leaking commit list in git-cherry(1)
  merge-recursive: fix memory leak when finalizing merge
  builtin/merge-recursive: fix leaking object ID bases
  builtin/difftool: plug memory leaks in `run_dir_diff()`
  object-name: free leaking object contexts
  ...
This commit is contained in:
Junio C Hamano
2024-07-08 14:53:10 -07:00
130 changed files with 591 additions and 272 deletions

88
apply.c
View File

@ -137,6 +137,7 @@ void clear_apply_state(struct apply_state *state)
strset_clear(&state->removed_symlinks);
strset_clear(&state->kept_symlinks);
strbuf_release(&state->root);
FREE_AND_NULL(state->fake_ancestor);
/* &state->fn_table is cleared at the end of apply_patch() */
}
@ -2495,18 +2496,21 @@ static int match_fragment(struct apply_state *state,
int match_beginning, int match_end)
{
int i;
char *fixed_buf, *buf, *orig, *target;
struct strbuf fixed;
size_t fixed_len, postlen;
const char *orig, *target;
struct strbuf fixed = STRBUF_INIT;
size_t postlen;
int preimage_limit;
int ret;
if (preimage->nr + current_lno <= img->nr) {
/*
* The hunk falls within the boundaries of img.
*/
preimage_limit = preimage->nr;
if (match_end && (preimage->nr + current_lno != img->nr))
return 0;
if (match_end && (preimage->nr + current_lno != img->nr)) {
ret = 0;
goto out;
}
} else if (state->ws_error_action == correct_ws_error &&
(ws_rule & WS_BLANK_AT_EOF)) {
/*
@ -2523,17 +2527,23 @@ static int match_fragment(struct apply_state *state,
* we are not removing blanks at the end, so we
* should reject the hunk at this position.
*/
return 0;
ret = 0;
goto out;
}
if (match_beginning && current_lno)
return 0;
if (match_beginning && current_lno) {
ret = 0;
goto out;
}
/* Quick hash check */
for (i = 0; i < preimage_limit; i++)
for (i = 0; i < preimage_limit; i++) {
if ((img->line[current_lno + i].flag & LINE_PATCHED) ||
(preimage->line[i].hash != img->line[current_lno + i].hash))
return 0;
(preimage->line[i].hash != img->line[current_lno + i].hash)) {
ret = 0;
goto out;
}
}
if (preimage_limit == preimage->nr) {
/*
@ -2546,8 +2556,10 @@ static int match_fragment(struct apply_state *state,
if ((match_end
? (current + preimage->len == img->len)
: (current + preimage->len <= img->len)) &&
!memcmp(img->buf + current, preimage->buf, preimage->len))
return 1;
!memcmp(img->buf + current, preimage->buf, preimage->len)) {
ret = 1;
goto out;
}
} else {
/*
* The preimage extends beyond the end of img, so
@ -2556,7 +2568,7 @@ static int match_fragment(struct apply_state *state,
* There must be one non-blank context line that match
* a line before the end of img.
*/
char *buf_end;
const char *buf, *buf_end;
buf = preimage->buf;
buf_end = buf;
@ -2566,8 +2578,10 @@ static int match_fragment(struct apply_state *state,
for ( ; buf < buf_end; buf++)
if (!isspace(*buf))
break;
if (buf == buf_end)
return 0;
if (buf == buf_end) {
ret = 0;
goto out;
}
}
/*
@ -2575,12 +2589,16 @@ static int match_fragment(struct apply_state *state,
* fuzzy matching. We collect all the line length information because
* we need it to adjust whitespace if we match.
*/
if (state->ws_ignore_action == ignore_ws_change)
return line_by_line_fuzzy_match(img, preimage, postimage,
current, current_lno, preimage_limit);
if (state->ws_ignore_action == ignore_ws_change) {
ret = line_by_line_fuzzy_match(img, preimage, postimage,
current, current_lno, preimage_limit);
goto out;
}
if (state->ws_error_action != correct_ws_error)
return 0;
if (state->ws_error_action != correct_ws_error) {
ret = 0;
goto out;
}
/*
* The hunk does not apply byte-by-byte, but the hash says
@ -2609,7 +2627,7 @@ static int match_fragment(struct apply_state *state,
* but in this loop we will only handle the part of the
* preimage that falls within the file.
*/
strbuf_init(&fixed, preimage->len + 1);
strbuf_grow(&fixed, preimage->len + 1);
orig = preimage->buf;
target = img->buf + current;
for (i = 0; i < preimage_limit; i++) {
@ -2645,8 +2663,10 @@ static int match_fragment(struct apply_state *state,
postlen += tgtfix.len;
strbuf_release(&tgtfix);
if (!match)
goto unmatch_exit;
if (!match) {
ret = 0;
goto out;
}
orig += oldlen;
target += tgtlen;
@ -2667,9 +2687,13 @@ static int match_fragment(struct apply_state *state,
/* Try fixing the line in the preimage */
ws_fix_copy(&fixed, orig, oldlen, ws_rule, NULL);
for (j = fixstart; j < fixed.len; j++)
if (!isspace(fixed.buf[j]))
goto unmatch_exit;
for (j = fixstart; j < fixed.len; j++) {
if (!isspace(fixed.buf[j])) {
ret = 0;
goto out;
}
}
orig += oldlen;
}
@ -2679,16 +2703,16 @@ static int match_fragment(struct apply_state *state,
* has whitespace breakages unfixed, and fixing them makes the
* hunk match. Update the context lines in the postimage.
*/
fixed_buf = strbuf_detach(&fixed, &fixed_len);
if (postlen < postimage->len)
postlen = 0;
update_pre_post_images(preimage, postimage,
fixed_buf, fixed_len, postlen);
return 1;
fixed.buf, fixed.len, postlen);
unmatch_exit:
ret = 1;
out:
strbuf_release(&fixed);
return 0;
return ret;
}
static int find_pos(struct apply_state *state,