From 43d20a8c50355f7f68548e91bd8822c3cbfff52f Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Fri, 7 Oct 2011 22:20:20 -0500 Subject: [PATCH 1/3] refs.c: ensure struct whose member may be passed to realloc is initialized The variable "refs" is allocated on the stack but is not initialized. It is passed to read_packed_refs(), and its struct members may eventually be passed to add_ref() and ALLOC_GROW(). Since the structure has not been initialized, its members may contain random non-zero values. So let's initialize it. The call sequence looks something like this: resolve_gitlink_packed_ref(...) { struct cached_refs refs; ... read_packed_refs(f, &refs); ... } read_packed_refs(FILE*, struct cached_refs *cached_refs) { ... add_ref(name, sha1, flag, &cached_refs->packed, &last); ... } add_ref(..., struct ref_array *refs, struct ref_entry **) { ... ALLOC_GROW(refs->refs, refs->nr + 1, refs->alloc); } Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- refs.c | 1 + 1 file changed, 1 insertion(+) diff --git a/refs.c b/refs.c index 5835b40b0c..c31b461662 100644 --- a/refs.c +++ b/refs.c @@ -360,6 +360,7 @@ static int resolve_gitlink_packed_ref(char *name, int pathlen, const char *refna f = fopen(name, "r"); if (!f) return -1; + memset(&refs, 0, sizeof(refs)); read_packed_refs(f, &refs); fclose(f); ref = search_ref_array(&refs.packed, refname); From 687296960d774a45df31df7bc371d01106a6f6b7 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Fri, 7 Oct 2011 22:20:21 -0500 Subject: [PATCH 2/3] refs.c: abort ref search if ref array is empty The bsearch() implementation on IRIX 6.5 segfaults if it is passed NULL for the base array argument even if number-of-elements is zero. So, let's work around it by detecting an empty array and aborting early. This is a useful optimization in its own right anyway, since we avoid a useless allocation and initialization of the ref_entry when the ref array is empty. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- refs.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/refs.c b/refs.c index c31b461662..cbc4c5d28d 100644 --- a/refs.c +++ b/refs.c @@ -110,6 +110,9 @@ static struct ref_entry *search_ref_array(struct ref_array *array, const char *n if (name == NULL) return NULL; + if (!array->nr) + return NULL; + len = strlen(name) + 1; e = xmalloc(sizeof(struct ref_entry) + len); memcpy(e->name, name, len); From 17d68a54def69b20b39dd4f7323b359a827e6017 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Fri, 7 Oct 2011 22:20:22 -0500 Subject: [PATCH 3/3] refs.c: free duplicate entries in the ref array instead of leaking them Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- refs.c | 1 + 1 file changed, 1 insertion(+) diff --git a/refs.c b/refs.c index cbc4c5d28d..df39297604 100644 --- a/refs.c +++ b/refs.c @@ -94,6 +94,7 @@ static void sort_ref_array(struct ref_array *array) die("Duplicated ref, and SHA1s don't match: %s", a->name); warning("Duplicated ref: %s", a->name); + free(b); continue; } i++;