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:
88
apply.c
88
apply.c
@ -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,
|
||||
|
Reference in New Issue
Block a user