{"thread":{"id":"11454","subject":"[PATCH] receive-pack: reject invalid refnames","startedAt":"2008-01-02T21:52:06Z","lastAt":"2008-01-03T21:40:07Z","messageCount":2,"participants":["Martin Koegler","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"64354","messageId":"1199310726946-git-send-email-mkoegler@auto.tuwien.ac.at","threadId":"11454","inReplyTo":null,"subject":"[PATCH] receive-pack: reject invalid refnames","fromName":"Martin Koegler","fromEmail":"mkoegler@auto.tuwien.ac.at","sentAt":"2008-01-02T21:52:06Z","receivedAt":"2008-01-02T21:52:06Z","isPatch":true,"sender":{"key":"mkoegler@auto.tuwien.ac.at","avatar":null},"body":"Signed-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>\n---\n receive-pack.c |    7 +++++--\n 1 files changed, 5 insertions(+), 2 deletions(-)\n\ndiff --git a/receive-pack.c b/receive-pack.c\nindex d0a563d..a038a40 100644\n--- a/receive-pack.c\n+++ b/receive-pack.c\n@@ -165,7 +165,9 @@ static const char *update(struct command *cmd)\n \tunsigned char *new_sha1 = cmd->new_sha1;\n \tstruct ref_lock *lock;\n \n-\tif (!prefixcmp(name, \"refs/\") && check_ref_format(name + 5)) {\n+\t/* only HEAD and refs/... are allowed */\n+\tif (strcmp(name, \"HEAD\") && \n+\t    (prefixcmp(name, \"refs/\") || check_ref_format(name + 5))) {\n \t\terror(\"refusing to create funny ref '%s' remotely\", name);\n \t\treturn \"funny refname\";\n \t}\n@@ -177,7 +179,8 @@ static const char *update(struct command *cmd)\n \t}\n \tif (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&\n \t    !is_null_sha1(old_sha1) &&\n-\t    !prefixcmp(name, \"refs/heads/\")) {\n+\t    (!prefixcmp(name, \"refs/heads/\") ||\n+\t     !strcmp(name, \"HEAD\"))) {\n \t\tstruct object *old_object, *new_object;\n \t\tstruct commit *old_commit, *new_commit;\n \t\tstruct commit_list *bases, *ent;\n-- \n1.4.4.4\n"},{"id":"64398","messageId":"7vy7b6oafc.fsf@gitster.siamese.dyndns.org","threadId":"11454","inReplyTo":"1199310726946-git-send-email-mkoegler@auto.tuwien.ac.at","subject":"Re: [PATCH] receive-pack: reject invalid refnames","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-03T21:40:07Z","receivedAt":"2008-01-03T21:40:07Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Martin Koegler <mkoegler@auto.tuwien.ac.at> writes:\n\n> Signed-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>\n> ---\n>  receive-pack.c |    7 +++++--\n>  1 files changed, 5 insertions(+), 2 deletions(-)\n>\n> diff --git a/receive-pack.c b/receive-pack.c\n> index d0a563d..a038a40 100644\n> --- a/receive-pack.c\n> +++ b/receive-pack.c\n> @@ -165,7 +165,9 @@ static const char *update(struct command *cmd)\n>  \tunsigned char *new_sha1 = cmd->new_sha1;\n>  \tstruct ref_lock *lock;\n>  \n> -\tif (!prefixcmp(name, \"refs/\") && check_ref_format(name + 5)) {\n> +\t/* only HEAD and refs/... are allowed */\n> +\tif (strcmp(name, \"HEAD\") && \n> +\t    (prefixcmp(name, \"refs/\") || check_ref_format(name + 5))) {\n>  \t\terror(\"refusing to create funny ref '%s' remotely\", name);\n>  \t\treturn \"funny refname\";\n>  \t}\n> @@ -177,7 +179,8 @@ static const char *update(struct command *cmd)\n>  \t}\n>  \tif (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&\n>  \t    !is_null_sha1(old_sha1) &&\n> -\t    !prefixcmp(name, \"refs/heads/\")) {\n> +\t    (!prefixcmp(name, \"refs/heads/\") ||\n> +\t     !strcmp(name, \"HEAD\"))) {\n>  \t\tstruct object *old_object, *new_object;\n>  \t\tstruct commit *old_commit, *new_commit;\n>  \t\tstruct commit_list *bases, *ent;\n\nYuck.  What I was smoking.\n\nNormal client \"git push\" does not even allow \"git push victim\nfoo:HEAD\".  So if name is \"HEAD\" that has to be a malicious\ncrafted push.\n\nI think \n\n\tif (prefixcmp(name, \"refs/\") || check_ref_format(name + 5))\n\t\terror();\n\nis enough and correct.\n\nSorry for my earlier thinko.\n"}]}