Code

refs.c: ensure struct whose member may be passed to realloc is initialized
authorBrandon Casey <drafnel@gmail.com>
Sat, 8 Oct 2011 03:20:20 +0000 (22:20 -0500)
committerJunio C Hamano <gitster@pobox.com>
Mon, 10 Oct 2011 17:05:07 +0000 (10:05 -0700)
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 <casey@nrlssc.navy.mil>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
refs.c

diff --git a/refs.c b/refs.c
index 5835b40b0cb1e707323aaa0d4c837a7ab21d99d0..c31b4616629b0c822ec03669e1e3091bb6d56403 100644 (file)
--- 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);