{"thread":{"id":"13482","subject":"[PATCH] Add alloc_ref_from_str() to replace pattern of alloc_ref() from strings.","startedAt":"2008-05-11T20:12:21Z","lastAt":"2008-05-11T20:12:21Z","messageCount":1,"participants":["kkowalczyk@gmail.com"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"76661","messageId":"1210536741-19604-1-git-send-email-kkowalczyk@gmail.com","threadId":"13482","inReplyTo":null,"subject":"[PATCH] Add alloc_ref_from_str() to replace pattern of alloc_ref() from strings.","fromName":"","fromEmail":"kkowalczyk@gmail.com","sentAt":"2008-05-11T20:12:21Z","receivedAt":"2008-05-11T20:12:21Z","isPatch":true,"sender":{"key":"kkowalczyk@gmail.com","avatar":"https://gravatar.com/avatar/e959d54bb779ff1db95338a1ca1955bd832c8083ac9e92b344028ab2f10e4b4c?d=mp&s=160"},"body":"From: Krzysztof Kowalczyk <kkowalczyk@gmail.com>\n\nFixes memory corruption in interpret_target() due to overwriting\na string and avoids such problems in the future. Makes alloc_ref()\nuse xcalloc() for compactness.\n\nSigned-off-by: Krzysztof Kowalczyk <kkowalczyk@gmail.com>\n---\n builtin-fetch.c |    6 ++----\n http-push.c     |    6 ++----\n remote.c        |   29 ++++++++++++-----------------\n remote.h        |    2 ++\n transport.c     |    6 ++----\n walker.c        |    3 +--\n 6 files changed, 21 insertions(+), 31 deletions(-)\n\ndiff --git a/builtin-fetch.c b/builtin-fetch.c\nindex e56617e..f6584ec 100644\n--- a/builtin-fetch.c\n+++ b/builtin-fetch.c\n@@ -508,10 +508,8 @@ static void find_non_local_tags(struct transport *transport,\n \t\t     will_fetch(head, ref->old_sha1))) {\n \t\t\tpath_list_insert(ref_name, &new_refs);\n \n-\t\t\trm = alloc_ref(strlen(ref_name) + 1);\n-\t\t\tstrcpy(rm->name, ref_name);\n-\t\t\trm->peer_ref = alloc_ref(strlen(ref_name) + 1);\n-\t\t\tstrcpy(rm->peer_ref->name, ref_name);\n+\t\t\trm = alloc_ref_from_str(ref_name);\n+\t\t\trm->peer_ref = alloc_ref_from_str(ref_name);\n \t\t\thashcpy(rm->old_sha1, ref_sha1);\n \n \t\t\t**tail = rm;\ndiff --git a/http-push.c b/http-push.c\nindex 939a764..42727c8 100644\n--- a/http-push.c\n+++ b/http-push.c\n@@ -1761,8 +1761,7 @@ static void one_remote_ref(char *refname)\n \tstruct ref *ref;\n \tstruct object *obj;\n \n-\tref = alloc_ref(strlen(refname) + 1);\n-\tstrcpy(ref->name, refname);\n+\tref = alloc_ref_from_str(refname);\n \n \tif (http_fetch_ref(remote->url, ref) != 0) {\n \t\tfprintf(stderr,\n@@ -1894,8 +1893,7 @@ static void add_remote_info_ref(struct remote_ls_ctx *ls)\n \tchar *ref_info;\n \tstruct ref *ref;\n \n-\tref = alloc_ref(strlen(ls->dentry_name) + 1);\n-\tstrcpy(ref->name, ls->dentry_name);\n+\tref = alloc_ref_from_str(ls->dentry_name);\n \n \tif (http_fetch_ref(remote->url, ref) != 0) {\n \t\tfprintf(stderr,\ndiff --git a/remote.c b/remote.c\nindex 6b480cb..780d497 100644\n--- a/remote.c\n+++ b/remote.c\n@@ -686,8 +686,14 @@ int remote_find_tracking(struct remote *remote, struct refspec *refspec)\n \n struct ref *alloc_ref(unsigned namelen)\n {\n-\tstruct ref *ret = xmalloc(sizeof(struct ref) + namelen);\n-\tmemset(ret, 0, sizeof(struct ref) + namelen);\n+\treturn xcalloc(sizeof(struct ref) + namelen, 1);\n+}\n+\n+struct ref *alloc_ref_from_str(const char* str)\n+{\n+\tunsigned len = strlen(str) + 1;\n+\tstruct ref *ret = alloc_ref(len);\n+\tmemcpy(ret->name, str, len);\n \treturn ret;\n }\n \n@@ -797,31 +803,22 @@ static struct ref *try_explicit_object_name(const char *name)\n {\n \tunsigned char sha1[20];\n \tstruct ref *ref;\n-\tint len;\n \n \tif (!*name) {\n-\t\tref = alloc_ref(20);\n-\t\tstrcpy(ref->name, \"(delete)\");\n+\t\tref = alloc_ref_from_str(\"(delete)\");\n \t\thashclr(ref->new_sha1);\n \t\treturn ref;\n \t}\n \tif (get_sha1(name, sha1))\n \t\treturn NULL;\n-\tlen = strlen(name) + 1;\n-\tref = alloc_ref(len);\n-\tmemcpy(ref->name, name, len);\n+\tref = alloc_ref_from_str(name);\n \thashcpy(ref->new_sha1, sha1);\n \treturn ref;\n }\n \n static struct ref *make_linked_ref(const char *name, struct ref ***tail)\n {\n-\tstruct ref *ret;\n-\tsize_t len;\n-\n-\tlen = strlen(name) + 1;\n-\tret = alloc_ref(len);\n-\tmemcpy(ret->name, name, len);\n+\tstruct ref *ret = alloc_ref_from_str(name);\n \ttail_link_ref(ret, tail);\n \treturn ret;\n }\n@@ -1125,9 +1122,7 @@ static struct ref *get_local_ref(const char *name)\n \t\treturn NULL;\n \n \tif (!prefixcmp(name, \"refs/\")) {\n-\t\tret = alloc_ref(strlen(name) + 1);\n-\t\tstrcpy(ret->name, name);\n-\t\treturn ret;\n+\t\treturn alloc_ref_from_str(name);\n \t}\n \n \tif (!prefixcmp(name, \"heads/\") ||\ndiff --git a/remote.h b/remote.h\nindex 75d006b..2ee83a3 100644\n--- a/remote.h\n+++ b/remote.h\n@@ -54,6 +54,8 @@ struct refspec {\n \n struct ref *alloc_ref(unsigned namelen);\n \n+struct ref *alloc_ref_from_str(const char* str);\n+\n struct ref *copy_ref_list(const struct ref *ref);\n \n int check_ref_type(const struct ref *ref, int flags);\ndiff --git a/transport.c b/transport.c\nindex b012a28..1bc16f2 100644\n--- a/transport.c\n+++ b/transport.c\n@@ -504,8 +504,7 @@ static struct ref *get_refs_via_curl(struct transport *transport)\n \n \tstrbuf_release(&buffer);\n \n-\tref = alloc_ref(strlen(\"HEAD\") + 1);\n-\tstrcpy(ref->name, \"HEAD\");\n+\tref = alloc_ref_from_str(\"HEAD\");\n \tif (!walker->fetch_ref(walker, ref) &&\n \t    !resolve_remote_symref(ref, refs)) {\n \t\tref->next = refs;\n@@ -546,9 +545,8 @@ static struct ref *get_refs_from_bundle(struct transport *transport)\n \t\tdie (\"Could not read bundle '%s'.\", transport->url);\n \tfor (i = 0; i < data->header.references.nr; i++) {\n \t\tstruct ref_list_entry *e = data->header.references.list + i;\n-\t\tstruct ref *ref = alloc_ref(strlen(e->name) + 1);\n+\t\tstruct ref *ref = alloc_ref_from_str(e->name);\n \t\thashcpy(ref->old_sha1, e->sha1);\n-\t\tstrcpy(ref->name, e->name);\n \t\tref->next = result;\n \t\tresult = ref;\n \t}\ndiff --git a/walker.c b/walker.c\nindex fa96a7c..31de6c1 100644\n--- a/walker.c\n+++ b/walker.c\n@@ -190,8 +190,7 @@ static int interpret_target(struct walker *walker, char *target, unsigned char *\n \tif (!get_sha1_hex(target, sha1))\n \t\treturn 0;\n \tif (!check_ref_format(target)) {\n-\t\tstruct ref *ref = alloc_ref(strlen(target));\n-\t\tstrcpy(ref->name, target);\n+\t\tstruct ref *ref = alloc_ref_from_str(target);\n \t\tif (!walker->fetch_ref(walker, ref)) {\n \t\t\thashcpy(sha1, ref->old_sha1);\n \t\t\tfree(ref);\n-- \n1.5.4.5\n"}]}