http-push: trim trailing newline from remote symref
authorJeff King <>
Tue, 13 Jan 2015 02:28:58 +0000 (21:28 -0500)
committerJunio C Hamano <>
Wed, 14 Jan 2015 18:28:02 +0000 (10:28 -0800)
When we fetch a symbolic ref file from the remote, we get
the whole string "ref: refs/heads/master\n", recognize it by
skipping past the "ref: ", and store the rest. We should
chomp the trailing newline.

This bug was introduced in ae021d8 (use skip_prefix to avoid
magic numbers, 2014-06-18), which did not notice that the
length computation fed to xmemdupz was quietly tweaked by 1
to account for this.

We can solve it by explicitly trimming the newline, which is
more obvious. Note that we use strbuf_rtrim here, which will
actually cut off any trailing whitespace, not just a single
newline. This is a good thing, though, as it makes our
parsing more liberal (and spaces are not valid in refnames

Signed-off-by: Jeff King <>
Tested-by: Kyle J. McKay <>
Signed-off-by: Junio C Hamano <>

index 952f8ed..0beb7ab 100644 (file)
@@ -1577,6 +1577,9 @@ static void fetch_symref(const char *path, char **symref, unsigned char *sha1)
        if (buffer.len == 0)
+       /* Cut off trailing newline. */
+       strbuf_rtrim(&buffer);
        /* If it's a symref, set the refname; otherwise try for a sha1 */
        if (skip_prefix(buffer.buf, "ref: ", &name)) {
                *symref = xmemdupz(name, buffer.len - (name - buffer.buf));