{"thread":{"id":"28629","subject":"[PATCH 1/3] refs.c: ensure struct whose member may be passed to realloc is initialized","startedAt":"2011-10-08T03:20:20Z","lastAt":"2011-10-08T03:20:22Z","messageCount":3,"participants":["Brandon Casey"],"isPatch":true,"patchVersion":1,"patchTotal":3},"messages":[{"id":"177211","messageId":"5WORKOGzj9pUA6-WazYHWim-cjAN1gZZBHymptluatadyqEWEpUinYhFsc02ctuYig5h-KCIT7ge7OiIw7zj9AjhDiO51YTCsLXHwmXkf9dE8yVtvwLqmJRFg5DOJRvlrZ-UjhNb04k@cipher.nrlssc.navy.mil","threadId":"28629","inReplyTo":"3k7giKa3PkJZo51iAXivXCFEZpYY2WC3depjtuvksrCQPax7dSLVCXpMlqLxWtZfSp6P10yMhMg@cipher.nrlssc.navy.mil","subject":"[PATCH 1/3] refs.c: ensure struct whose member may be passed to realloc is initialized","fromName":"Brandon Casey","fromEmail":"casey@nrlssc.navy.mil","sentAt":"2011-10-08T03:20:20Z","receivedAt":"2011-10-08T03:20:20Z","isPatch":true,"sender":{"key":"drafnel@gmail.com","avatar":"https://avatars.githubusercontent.com/u/921167?v=4"},"body":"From: Brandon Casey <drafnel@gmail.com>\n\nThe variable \"refs\" is allocated on the stack but is not initialized.  It\nis passed to read_packed_refs(), and its struct members may eventually be\npassed to add_ref() and ALLOC_GROW().  Since the structure has not been\ninitialized, its members may contain random non-zero values.  So let's\ninitialize it.\n\nThe call sequence looks something like this:\n\n   resolve_gitlink_packed_ref(...) {\n\n       struct cached_refs refs;\n       ...\n       read_packed_refs(f, &refs);\n       ...\n   }\n\n   read_packed_refs(FILE*, struct cached_refs *cached_refs) {\n       ...\n       add_ref(name, sha1, flag, &cached_refs->packed, &last);\n       ...\n   }\n\n   add_ref(..., struct ref_array *refs, struct ref_entry **) {\n       ...\n       ALLOC_GROW(refs->refs, refs->nr + 1, refs->alloc);\n   }\n\nSigned-off-by: Brandon Casey <casey@nrlssc.navy.mil>\n---\n refs.c |    1 +\n 1 files changed, 1 insertions(+), 0 deletions(-)\n\ndiff --git a/refs.c b/refs.c\nindex 5835b40..c31b461 100644\n--- a/refs.c\n+++ b/refs.c\n@@ -360,6 +360,7 @@ static int resolve_gitlink_packed_ref(char *name, int pathlen, const char *refna\n \tf = fopen(name, \"r\");\n \tif (!f)\n \t\treturn -1;\n+\tmemset(&refs, 0, sizeof(refs));\n \tread_packed_refs(f, &refs);\n \tfclose(f);\n \tref = search_ref_array(&refs.packed, refname);\n-- \n1.7.7\n"},{"id":"177212","messageId":"5WORKOGzj9pUA6-WazYHWimMbFMh2dFdPh-tzgQwRKUjBmg5avzikX-E8YCuF6-WDVQwYJe92QfzjJryO0gSItzZkhfefVSSSpOvoOUGB9HVM7KEfTIWsriW5ZyQAa1YxwTYeujykWQ@cipher.nrlssc.navy.mil","threadId":"28629","inReplyTo":"3k7giKa3PkJZo51iAXivXCFEZpYY2WC3depjtuvksrCQPax7dSLVCXpMlqLxWtZfSp6P10yMhMg@cipher.nrlssc.navy.mil","subject":"[PATCH 2/3] refs.c: abort ref search if ref array is empty","fromName":"Brandon Casey","fromEmail":"casey@nrlssc.navy.mil","sentAt":"2011-10-08T03:20:21Z","receivedAt":"2011-10-08T03:20:21Z","isPatch":true,"sender":{"key":"drafnel@gmail.com","avatar":"https://avatars.githubusercontent.com/u/921167?v=4"},"body":"From: Brandon Casey <drafnel@gmail.com>\n\nThe bsearch() implementation on IRIX 6.5 segfaults if it is passed NULL\nfor the base array argument even if number-of-elements is zero.  So, let's\nwork around it by detecting an empty array and aborting early.\n\nThis is a useful optimization in its own right anyway, since we avoid a\nuseless allocation and initialization of the ref_entry when the ref array\nis empty.\n\nSigned-off-by: Brandon Casey <casey@nrlssc.navy.mil>\n---\n refs.c |    3 +++\n 1 files changed, 3 insertions(+), 0 deletions(-)\n\ndiff --git a/refs.c b/refs.c\nindex c31b461..cbc4c5d 100644\n--- a/refs.c\n+++ b/refs.c\n@@ -110,6 +110,9 @@ static struct ref_entry *search_ref_array(struct ref_array *array, const char *n\n \tif (name == NULL)\n \t\treturn NULL;\n \n+\tif (!array->nr)\n+\t\treturn NULL;\n+\n \tlen = strlen(name) + 1;\n \te = xmalloc(sizeof(struct ref_entry) + len);\n \tmemcpy(e->name, name, len);\n-- \n1.7.7\n"},{"id":"177213","messageId":"5WORKOGzj9pUA6-WazYHWrx23BzZNuzssM-BrpbAt7jziy1qExfJm7by5NnJUMOk6ewCveYCPmzYGScMzowqtqJ8RZ9pZP6PRSU69BNSzr2gzdZ7nKtDsZyIEWyAD9p9GiIdHbxCa0M@cipher.nrlssc.navy.mil","threadId":"28629","inReplyTo":"3k7giKa3PkJZo51iAXivXCFEZpYY2WC3depjtuvksrCQPax7dSLVCXpMlqLxWtZfSp6P10yMhMg@cipher.nrlssc.navy.mil","subject":"[PATCH 3/3] refs.c: free duplicate entries in the ref array instead of leaking them","fromName":"Brandon Casey","fromEmail":"casey@nrlssc.navy.mil","sentAt":"2011-10-08T03:20:22Z","receivedAt":"2011-10-08T03:20:22Z","isPatch":true,"sender":{"key":"drafnel@gmail.com","avatar":"https://avatars.githubusercontent.com/u/921167?v=4"},"body":"From: Brandon Casey <drafnel@gmail.com>\n\n\nSigned-off-by: Brandon Casey <casey@nrlssc.navy.mil>\n---\n refs.c |    1 +\n 1 files changed, 1 insertions(+), 0 deletions(-)\n\ndiff --git a/refs.c b/refs.c\nindex cbc4c5d..df39297 100644\n--- a/refs.c\n+++ b/refs.c\n@@ -94,6 +94,7 @@ static void sort_ref_array(struct ref_array *array)\n \t\t\t\tdie(\"Duplicated ref, and SHA1s don't match: %s\",\n \t\t\t\t    a->name);\n \t\t\twarning(\"Duplicated ref: %s\", a->name);\n+\t\t\tfree(b);\n \t\t\tcontinue;\n \t\t}\n \t\ti++;\n-- \n1.7.7\n"}]}