threads / patch / 32794

patchpush: fix segfault when HEAD points nowhere

Subject: [PATCH] push: fix segfault when HEAD points nowhere

## tl;dr

2 messages between Jan 31, 2013 and Jan 31, 2013. Diffs are folded; open one to read it.

replies: 1people: 2as markdown or json

Fraser Tweedale· Jan 31, 2013, 12:22 UTC · lore

When reporting the outcome of a push, a segfault occurs if HEAD does not point somewhere. Check that HEAD points somewhere before trying to strcmp it.

Signed-off-by: Fraser Tweedale <frase@frase.id.au>
---
 transport.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
Show changes to transport.c +1 −1
diff --git a/transport.c b/transport.c
index 9932f40..b9306ef 100644
--- a/transport.c
+++ b/transport.c
@@ -741,7 +741,7 @@ void transport_print_push_status(const char *dest, struct ref *refs,
 			n += print_one_push_status(ref, dest, n, porcelain);
 		if (ref->status == REF_STATUS_REJECT_NONFASTFORWARD &&
 		    *nonfastforward != NON_FF_HEAD) {
-			if (!strcmp(head, ref->name))
+			if (head != NULL && !strcmp(head, ref->name))
 				*nonfastforward = NON_FF_HEAD;
 			else
 				*nonfastforward = NON_FF_OTHER;
-- 
1.8.1.1
Junio C Hamano· Jan 31, 2013, 16:06 UTC · re: Fraser Tweedale · lore

Re: [PATCH] push: fix segfault when HEAD points nowhere

Fraser Tweedale <frase@frase.id.au> writes:
Show 22 quoted lines
> When reporting the outcome of a push, a segfault occurs if HEAD does
> not point somewhere.  Check that HEAD points somewhere before trying
> to strcmp it.
>
> Signed-off-by: Fraser Tweedale <frase@frase.id.au>
> ---
>  transport.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/transport.c b/transport.c
> index 9932f40..b9306ef 100644
> --- a/transport.c
> +++ b/transport.c
> @@ -741,7 +741,7 @@ void transport_print_push_status(const char *dest, struct ref *refs,
>  			n += print_one_push_status(ref, dest, n, porcelain);
>  		if (ref->status == REF_STATUS_REJECT_NONFASTFORWARD &&
>  		    *nonfastforward != NON_FF_HEAD) {
> -			if (!strcmp(head, ref->name))
> +			if (head != NULL && !strcmp(head, ref->name))
>  				*nonfastforward = NON_FF_HEAD;
>  			else
>  				*nonfastforward = NON_FF_OTHER;
Wow.

This is a bug that is hard to trigger by just using the software (you have to be doubly insane to be on an unborn branch and pushing out a branch that is not the one you are currently on) and one has to look at the code to hunt for it.

The fix looks correct.  Thank you very much for spotting.

← back to recent threads