{"thread":{"id":"32794","subject":"[PATCH] push: fix segfault when HEAD points nowhere","startedAt":"2013-01-31T12:22:51Z","lastAt":"2013-01-31T16:06:19Z","messageCount":2,"participants":["Fraser Tweedale","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"208353","messageId":"1359634971-79036-1-git-send-email-frase@frase.id.au","threadId":"32794","inReplyTo":null,"subject":"[PATCH] push: fix segfault when HEAD points nowhere","fromName":"Fraser Tweedale","fromEmail":"frase@frase.id.au","sentAt":"2013-01-31T12:22:51Z","receivedAt":"2013-01-31T12:22:51Z","isPatch":true,"sender":{"key":"frase@frase.id.au","avatar":"https://avatars.githubusercontent.com/u/2331938?v=4"},"body":"When reporting the outcome of a push, a segfault occurs if HEAD does\nnot point somewhere.  Check that HEAD points somewhere before trying\nto strcmp it.\n\nSigned-off-by: Fraser Tweedale <frase@frase.id.au>\n---\n transport.c | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)\n\ndiff --git a/transport.c b/transport.c\nindex 9932f40..b9306ef 100644\n--- a/transport.c\n+++ b/transport.c\n@@ -741,7 +741,7 @@ void transport_print_push_status(const char *dest, struct ref *refs,\n \t\t\tn += print_one_push_status(ref, dest, n, porcelain);\n \t\tif (ref->status == REF_STATUS_REJECT_NONFASTFORWARD &&\n \t\t    *nonfastforward != NON_FF_HEAD) {\n-\t\t\tif (!strcmp(head, ref->name))\n+\t\t\tif (head != NULL && !strcmp(head, ref->name))\n \t\t\t\t*nonfastforward = NON_FF_HEAD;\n \t\t\telse\n \t\t\t\t*nonfastforward = NON_FF_OTHER;\n-- \n1.8.1.1\n"},{"id":"208360","messageId":"7vlib9ibgk.fsf@alter.siamese.dyndns.org","threadId":"32794","inReplyTo":"1359634971-79036-1-git-send-email-frase@frase.id.au","subject":"Re: [PATCH] push: fix segfault when HEAD points nowhere","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2013-01-31T16:06:19Z","receivedAt":"2013-01-31T16:06:19Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Fraser Tweedale <frase@frase.id.au> writes:\n\n> When reporting the outcome of a push, a segfault occurs if HEAD does\n> not point somewhere.  Check that HEAD points somewhere before trying\n> to strcmp it.\n>\n> Signed-off-by: Fraser Tweedale <frase@frase.id.au>\n> ---\n>  transport.c | 2 +-\n>  1 file changed, 1 insertion(+), 1 deletion(-)\n>\n> diff --git a/transport.c b/transport.c\n> index 9932f40..b9306ef 100644\n> --- a/transport.c\n> +++ b/transport.c\n> @@ -741,7 +741,7 @@ void transport_print_push_status(const char *dest, struct ref *refs,\n>  \t\t\tn += print_one_push_status(ref, dest, n, porcelain);\n>  \t\tif (ref->status == REF_STATUS_REJECT_NONFASTFORWARD &&\n>  \t\t    *nonfastforward != NON_FF_HEAD) {\n> -\t\t\tif (!strcmp(head, ref->name))\n> +\t\t\tif (head != NULL && !strcmp(head, ref->name))\n>  \t\t\t\t*nonfastforward = NON_FF_HEAD;\n>  \t\t\telse\n>  \t\t\t\t*nonfastforward = NON_FF_OTHER;\n\nWow.\n\nThis is a bug that is hard to trigger by just using the software\n(you have to be doubly insane to be on an unborn branch and pushing\nout a branch that is not the one you are currently on) and one has\nto look at the code to hunt for it.\n\nThe fix looks correct.  Thank you very much for spotting.\n"}]}