Skip to content

Commit 244c272

Browse files
avargitster
authored andcommitted
diff.[ch]: have diff_free() call clear_pathspec(opts.pathspec)
Have the diff_free() function call clear_pathspec(). Since the diff_flush() function calls this all its callers can be simplified to rely on it instead. When I added the diff_free() function in e900d49 (diff: add an API for deferred freeing, 2021-02-11) I simply missed this, or wasn't interested in it. Let's consolidate this now. This means that any future callers (and I've got revision.c in mind) that embed a "struct diff_options" can simply call diff_free() instead of needing know that it has an embedded pathspec. This does fix a bunch of leaks, but I can't mark any test here as passing under the SANITIZE=leak testing mode because in 886e108 (builtin/: add UNLEAKs, 2017-10-01) an UNLEAK(rev) was added, which plasters over the memory leak. E.g. "t4011-diff-symlink.sh" would report fewer leaks with this fix, but because of the UNLEAK() reports none. I'll eventually loop around to removing that UNLEAK(rev) annotation as I'll fix deeper issues with the revisions API leaking. This is one small step on the way there, a new freeing function in revisions.c will want to call this diff_free(). Signed-off-by: Ævar Arnfjörð Bjarmason <[email protected]> Reviewed-by: Elijah Newren <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 4c53a8c commit 244c272

File tree

5 files changed

+4
-9
lines changed

5 files changed

+4
-9
lines changed

add-interactive.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -797,14 +797,14 @@ static int run_revert(struct add_i_state *s, const struct pathspec *ps,
797797
diffopt.flags.override_submodule_config = 1;
798798
diffopt.repo = s->r;
799799

800-
if (do_diff_cache(&oid, &diffopt))
800+
if (do_diff_cache(&oid, &diffopt)) {
801+
diff_free(&diffopt);
801802
res = -1;
802-
else {
803+
} else {
803804
diffcore_std(&diffopt);
804805
diff_flush(&diffopt);
805806
}
806807
free(paths);
807-
clear_pathspec(&diffopt.pathspec);
808808

809809
if (!res && write_locked_index(s->r->index, &index_lock,
810810
COMMIT_LOCK) < 0)

blame.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1403,7 +1403,6 @@ static struct blame_origin *find_origin(struct repository *r,
14031403
}
14041404
}
14051405
diff_flush(&diff_opts);
1406-
clear_pathspec(&diff_opts.pathspec);
14071406
return porigin;
14081407
}
14091408

@@ -1447,7 +1446,6 @@ static struct blame_origin *find_rename(struct repository *r,
14471446
}
14481447
}
14491448
diff_flush(&diff_opts);
1450-
clear_pathspec(&diff_opts.pathspec);
14511449
return porigin;
14521450
}
14531451

@@ -2328,7 +2326,6 @@ static void find_copy_in_parent(struct blame_scoreboard *sb,
23282326
} while (unblamed);
23292327
target->suspects = reverse_blame(leftover, NULL);
23302328
diff_flush(&diff_opts);
2331-
clear_pathspec(&diff_opts.pathspec);
23322329
}
23332330

23342331
/*

builtin/reset.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,6 @@ static int read_from_tree(const struct pathspec *pathspec,
274274
return 1;
275275
diffcore_std(&opt);
276276
diff_flush(&opt);
277-
clear_pathspec(&opt.pathspec);
278277

279278
return 0;
280279
}

diff.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6345,6 +6345,7 @@ void diff_free(struct diff_options *options)
63456345

63466346
diff_free_file(options);
63476347
diff_free_ignore_regex(options);
6348+
clear_pathspec(&options->pathspec);
63486349
}
63496350

63506351
void diff_flush(struct diff_options *options)

notes-merge.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,6 @@ static struct notes_merge_pair *diff_tree_remote(struct notes_merge_options *o,
175175
oid_to_hex(&mp->remote));
176176
}
177177
diff_flush(&opt);
178-
clear_pathspec(&opt.pathspec);
179178

180179
*num_changes = len;
181180
return changes;
@@ -261,7 +260,6 @@ static void diff_tree_local(struct notes_merge_options *o,
261260
oid_to_hex(&mp->local));
262261
}
263262
diff_flush(&opt);
264-
clear_pathspec(&opt.pathspec);
265263
}
266264

267265
static void check_notes_merge_worktree(struct notes_merge_options *o)

0 commit comments

Comments
 (0)