mirror of
https://github.com/git/git.git
synced 2026-01-10 10:13:33 +00:00
commit-graph: fix memory leak in misused string_list API
When this code was migrated to the string_list API in
d88b14b3fd (commit-graph: use string-list API for input, 2018-06-27)
it was made to use used both STRING_LIST_INIT_NODUP and a
strbuf_detach() pattern.
Those should not be used together if string_list_clear() is expected
to free the memory, instead we need to either use STRING_LIST_INIT_DUP
with a string_list_append_nodup(), or a STRING_LIST_INIT_NODUP and
manually fiddle with the "strdup_strings" member before calling
string_list_clear(). Let's do the former.
Since "strdup_strings = 1" is set now other code might be broken by
relying on "pack_indexes" not to duplicate it strings, but that
doesn't happen. When we pass this down to write_commit_graph() that
code uses the "struct string_list" without modifying it. Let's add a
"const" to the variable to have the compiler enforce that assumption.
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
8f79015111
commit
4a0479086a
@@ -192,7 +192,7 @@ static int git_commit_graph_write_config(const char *var, const char *value,
|
|||||||
|
|
||||||
static int graph_write(int argc, const char **argv)
|
static int graph_write(int argc, const char **argv)
|
||||||
{
|
{
|
||||||
struct string_list pack_indexes = STRING_LIST_INIT_NODUP;
|
struct string_list pack_indexes = STRING_LIST_INIT_DUP;
|
||||||
struct strbuf buf = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT;
|
||||||
struct oidset commits = OIDSET_INIT;
|
struct oidset commits = OIDSET_INIT;
|
||||||
struct object_directory *odb = NULL;
|
struct object_directory *odb = NULL;
|
||||||
@@ -273,8 +273,8 @@ static int graph_write(int argc, const char **argv)
|
|||||||
|
|
||||||
if (opts.stdin_packs) {
|
if (opts.stdin_packs) {
|
||||||
while (strbuf_getline(&buf, stdin) != EOF)
|
while (strbuf_getline(&buf, stdin) != EOF)
|
||||||
string_list_append(&pack_indexes,
|
string_list_append_nodup(&pack_indexes,
|
||||||
strbuf_detach(&buf, NULL));
|
strbuf_detach(&buf, NULL));
|
||||||
} else if (opts.stdin_commits) {
|
} else if (opts.stdin_commits) {
|
||||||
oidset_init(&commits, 0);
|
oidset_init(&commits, 0);
|
||||||
if (opts.progress)
|
if (opts.progress)
|
||||||
|
|||||||
@@ -1679,7 +1679,7 @@ int write_commit_graph_reachable(struct object_directory *odb,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int fill_oids_from_packs(struct write_commit_graph_context *ctx,
|
static int fill_oids_from_packs(struct write_commit_graph_context *ctx,
|
||||||
struct string_list *pack_indexes)
|
const struct string_list *pack_indexes)
|
||||||
{
|
{
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
struct strbuf progress_title = STRBUF_INIT;
|
struct strbuf progress_title = STRBUF_INIT;
|
||||||
@@ -2259,7 +2259,7 @@ out:
|
|||||||
}
|
}
|
||||||
|
|
||||||
int write_commit_graph(struct object_directory *odb,
|
int write_commit_graph(struct object_directory *odb,
|
||||||
struct string_list *pack_indexes,
|
const struct string_list *const pack_indexes,
|
||||||
struct oidset *commits,
|
struct oidset *commits,
|
||||||
enum commit_graph_write_flags flags,
|
enum commit_graph_write_flags flags,
|
||||||
const struct commit_graph_opts *opts)
|
const struct commit_graph_opts *opts)
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ int write_commit_graph_reachable(struct object_directory *odb,
|
|||||||
enum commit_graph_write_flags flags,
|
enum commit_graph_write_flags flags,
|
||||||
const struct commit_graph_opts *opts);
|
const struct commit_graph_opts *opts);
|
||||||
int write_commit_graph(struct object_directory *odb,
|
int write_commit_graph(struct object_directory *odb,
|
||||||
struct string_list *pack_indexes,
|
const struct string_list *pack_indexes,
|
||||||
struct oidset *commits,
|
struct oidset *commits,
|
||||||
enum commit_graph_write_flags flags,
|
enum commit_graph_write_flags flags,
|
||||||
const struct commit_graph_opts *opts);
|
const struct commit_graph_opts *opts);
|
||||||
|
|||||||
Reference in New Issue
Block a user