ident: reject all-crud ident name
An ident name consisting of only "crud" characters (like whitespace or punctuation) is effectively the same as an empty one, because our strbuf_addstr_without_crud() will remove those characters. We reject an empty name when formatting a strict ident, but don't notice an all-crud one because our check happens before the crud-removal step. We could skip past the crud before checking for an empty name, but let's make it a separate code path, for two reasons. One is that we can give a more specific error message. And two is that unlike a blank name, we probably don't want to kick in the fallback-to-username behavior. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King committed
Feb 23, 2017 at 03:15 UTC
13b9a24e58f736b70e48846cf7e5b7cfa66c3fec
2 files changed
+16
ident.c
+11
@@ -203,6 +203,15 @@ static int crud(unsigned char c)
203
c == '\'';
204
}
205
206
+static int has_non_crud(const char *str)
207
+{
208
+ for (; *str; str++) {
209
+ if (!crud(*str))
210
+ return 1;
211
+ }
212
+ return 0;
213
+}
214
+
215
/*
216
* Copy over a string to the destination, but avoid special
217
* characters ('\n', '<' and '>') and remove crud at the end
@@ -389,6 +398,8 @@ const char *fmt_ident(const char *name, const char *email,
398
pw = xgetpwuid_self(NULL);
399
name = pw->pw_name;
400
}
401
+ if (strict && !has_non_crud(name))
402
+ die(_("name consists only of disallowed characters: %s"), name);
403
}
404
405
strbuf_reset(&ident);
t/t7518-ident-corner-cases.sh
+5
@@ -17,4 +17,9 @@ test_expect_success 'empty name and missing email' '
17
)
18
'
19
20
+test_expect_success 'commit rejects all-crud name' '
21
+ test_must_fail env GIT_AUTHOR_NAME=" .;<>" \
22
+ git commit --allow-empty -m foo
23
+'
24
+
25
test_done