diff options
author | Jens Lehmann <Jens.Lehmann@web.de> | 2010-01-31 17:43:49 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-01-31 10:25:23 -0800 |
commit | de7a79608c94f7319b55060741d6be98826deccb (patch) | |
tree | f5d733dee4ade78720a56dc912bcd53f903dd0a8 /submodule.c | |
parent | 6a5d0b0a90789ed92cb87f1b69cfeef2a1db3566 (diff) | |
download | git-de7a79608c94f7319b55060741d6be98826deccb.tar.gz git-de7a79608c94f7319b55060741d6be98826deccb.tar.xz |
Fix memory leak in submodule.c
The strbuf used in add_submodule_odb() was never released. So for every
submodule - populated or not - we leaked its object directory name when
using "git diff*" with the --submodule option.
Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'submodule.c')
-rw-r--r-- | submodule.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/submodule.c b/submodule.c index 6f7c21090..7d70c4f7b 100644 --- a/submodule.c +++ b/submodule.c @@ -10,17 +10,19 @@ static int add_submodule_odb(const char *path) { struct strbuf objects_directory = STRBUF_INIT; struct alternate_object_database *alt_odb; + int ret = 0; strbuf_addf(&objects_directory, "%s/.git/objects/", path); - if (!is_directory(objects_directory.buf)) - return -1; - + if (!is_directory(objects_directory.buf)) { + ret = -1; + goto done; + } /* avoid adding it twice */ for (alt_odb = alt_odb_list; alt_odb; alt_odb = alt_odb->next) if (alt_odb->name - alt_odb->base == objects_directory.len && !strncmp(alt_odb->base, objects_directory.buf, objects_directory.len)) - return 0; + goto done; alt_odb = xmalloc(objects_directory.len + 42 + sizeof(*alt_odb)); alt_odb->next = alt_odb_list; @@ -31,7 +33,9 @@ static int add_submodule_odb(const char *path) alt_odb->name[41] = '\0'; alt_odb_list = alt_odb; prepare_alt_odb(); - return 0; +done: + strbuf_release(&objects_directory); + return ret; } void show_submodule_summary(FILE *f, const char *path, |