summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--builtin/update-ref.c20
-rwxr-xr-xt/t1400-update-ref.sh4
2 files changed, 17 insertions, 7 deletions
diff --git a/builtin/update-ref.c b/builtin/update-ref.c
index 1292cfea11..02b5f950e3 100644
--- a/builtin/update-ref.c
+++ b/builtin/update-ref.c
@@ -62,16 +62,26 @@ static void update_store_old_sha1(struct ref_update *update,
update->have_old = *oldvalue || line_termination;
}
+/*
+ * Parse one whitespace- or NUL-terminated, possibly C-quoted argument
+ * and append the result to arg. Return a pointer to the terminator.
+ * Die if there is an error in how the argument is C-quoted. This
+ * function is only used if not -z.
+ */
static const char *parse_arg(const char *next, struct strbuf *arg)
{
- /* Parse SP-terminated, possibly C-quoted argument */
- if (*next != '"')
+ if (*next == '"') {
+ const char *orig = next;
+
+ if (unquote_c_style(arg, next, &next))
+ die("badly quoted argument: %s", orig);
+ if (*next && !isspace(*next))
+ die("unexpected character after quoted argument: %s", orig);
+ } else {
while (*next && !isspace(*next))
strbuf_addch(arg, *next++);
- else if (unquote_c_style(arg, next, &next))
- die("badly quoted argument: %s", next);
+ }
- /* Return position after the argument */
return next;
}
diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh
index 29391c67fc..774f8c5bf1 100755
--- a/t/t1400-update-ref.sh
+++ b/t/t1400-update-ref.sh
@@ -356,10 +356,10 @@ test_expect_success 'stdin fails on badly quoted input' '
grep "fatal: badly quoted argument: \\\"master" err
'
-test_expect_success 'stdin fails on arguments not separated by space' '
+test_expect_success 'stdin fails on junk after quoted argument' '
echo "create \"$a\"master" >stdin &&
test_must_fail git update-ref --stdin <stdin 2>err &&
- grep "fatal: expected SP but got: master" err
+ grep "fatal: unexpected character after quoted argument: \\\"$a\\\"master" err
'
test_expect_success 'stdin fails create with no ref' '