fast-import: check committer name more strictly

The documentation declares following identity format:
(<name> SP)? LT <email> GT
where name is any string without LF and LT characters.
But fast-import just accepts any string up to first GT
instead of checking the whole format, and moreover just
writes it as is to the commit object.

git-fsck checks for [^<\n]* <[^<>\n]*> format. Note that the
space is mandatory. And the space quirk is already handled via
extending the string to the left when needed.

Modify fast-import input identity format to a slightly stricter
one - deny LF, LT and GT in both <name> and <email>. And check
for it.

This is stricter then git-fsck as fsck accepts "Name> <email>"
currently, but soon fsck check will be adjusted likewise.

Signed-off-by: Dmitry Ivankov <divanorama@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Dmitry Ivankov 2011-08-11 16:21:08 +06:00 committed by Junio C Hamano
parent 17fb00721b
commit 4b4963c0e1
3 changed files with 24 additions and 19 deletions

View File

@ -413,8 +413,8 @@ Here `<name>` is the person's display name (for example
(``cm@example.com''). `LT` and `GT` are the literal less-than (\x3c) (``cm@example.com''). `LT` and `GT` are the literal less-than (\x3c)
and greater-than (\x3e) symbols. These are required to delimit and greater-than (\x3e) symbols. These are required to delimit
the email address from the other fields in the line. Note that the email address from the other fields in the line. Note that
`<name>` is free-form and may contain any sequence of bytes, except `<name>` and `<email>` are free-form and may contain any sequence
`LT` and `LF`. It is typically UTF-8 encoded. of bytes, except `LT`, `GT` and `LF`. `<name>` is typically UTF-8 encoded.


The time of the change is specified by `<when>` using the date format The time of the change is specified by `<when>` using the date format
that was selected by the \--date-format=<fmt> command line option. that was selected by the \--date-format=<fmt> command line option.

View File

@ -1967,7 +1967,7 @@ static int validate_raw_date(const char *src, char *result, int maxlen)


static char *parse_ident(const char *buf) static char *parse_ident(const char *buf)
{ {
const char *gt; const char *ltgt;
size_t name_len; size_t name_len;
char *ident; char *ident;


@ -1975,28 +1975,33 @@ static char *parse_ident(const char *buf)
if (*buf == '<') if (*buf == '<')
--buf; --buf;


gt = strrchr(buf, '>'); ltgt = buf + strcspn(buf, "<>");
if (!gt) if (*ltgt != '<')
die("Missing < in ident string: %s", buf);
if (ltgt != buf && ltgt[-1] != ' ')
die("Missing space before < in ident string: %s", buf);
ltgt = ltgt + 1 + strcspn(ltgt + 1, "<>");
if (*ltgt != '>')
die("Missing > in ident string: %s", buf); die("Missing > in ident string: %s", buf);
gt++; ltgt++;
if (*gt != ' ') if (*ltgt != ' ')
die("Missing space after > in ident string: %s", buf); die("Missing space after > in ident string: %s", buf);
gt++; ltgt++;
name_len = gt - buf; name_len = ltgt - buf;
ident = xmalloc(name_len + 24); ident = xmalloc(name_len + 24);
strncpy(ident, buf, name_len); strncpy(ident, buf, name_len);


switch (whenspec) { switch (whenspec) {
case WHENSPEC_RAW: case WHENSPEC_RAW:
if (validate_raw_date(gt, ident + name_len, 24) < 0) if (validate_raw_date(ltgt, ident + name_len, 24) < 0)
die("Invalid raw date \"%s\" in ident: %s", gt, buf); die("Invalid raw date \"%s\" in ident: %s", ltgt, buf);
break; break;
case WHENSPEC_RFC2822: case WHENSPEC_RFC2822:
if (parse_date(gt, ident + name_len, 24) < 0) if (parse_date(ltgt, ident + name_len, 24) < 0)
die("Invalid rfc2822 date \"%s\" in ident: %s", gt, buf); die("Invalid rfc2822 date \"%s\" in ident: %s", ltgt, buf);
break; break;
case WHENSPEC_NOW: case WHENSPEC_NOW:
if (strcmp("now", gt)) if (strcmp("now", ltgt))
die("Date in ident must be 'now': %s", buf); die("Date in ident must be 'now': %s", buf);
datestamp(ident + name_len, 24); datestamp(ident + name_len, 24);
break; break;

View File

@ -370,7 +370,7 @@ data <<COMMIT
empty commit empty commit
COMMIT COMMIT
INPUT_END INPUT_END
test_expect_failure 'B: fail on invalid committer (1)' ' test_expect_success 'B: fail on invalid committer (1)' '
test_must_fail git fast-import <input test_must_fail git fast-import <input
' '
git update-ref -d refs/heads/invalid-committer || true git update-ref -d refs/heads/invalid-committer || true
@ -382,7 +382,7 @@ data <<COMMIT
empty commit empty commit
COMMIT COMMIT
INPUT_END INPUT_END
test_expect_failure 'B: fail on invalid committer (2)' ' test_expect_success 'B: fail on invalid committer (2)' '
test_must_fail git fast-import <input test_must_fail git fast-import <input
' '
git update-ref -d refs/heads/invalid-committer || true git update-ref -d refs/heads/invalid-committer || true
@ -394,7 +394,7 @@ data <<COMMIT
empty commit empty commit
COMMIT COMMIT
INPUT_END INPUT_END
test_expect_failure 'B: fail on invalid committer (3)' ' test_expect_success 'B: fail on invalid committer (3)' '
test_must_fail git fast-import <input test_must_fail git fast-import <input
' '
git update-ref -d refs/heads/invalid-committer || true git update-ref -d refs/heads/invalid-committer || true
@ -406,7 +406,7 @@ data <<COMMIT
empty commit empty commit
COMMIT COMMIT
INPUT_END INPUT_END
test_expect_failure 'B: fail on invalid committer (4)' ' test_expect_success 'B: fail on invalid committer (4)' '
test_must_fail git fast-import <input test_must_fail git fast-import <input
' '
git update-ref -d refs/heads/invalid-committer || true git update-ref -d refs/heads/invalid-committer || true
@ -418,7 +418,7 @@ data <<COMMIT
empty commit empty commit
COMMIT COMMIT
INPUT_END INPUT_END
test_expect_failure 'B: fail on invalid committer (5)' ' test_expect_success 'B: fail on invalid committer (5)' '
test_must_fail git fast-import <input test_must_fail git fast-import <input
' '
git update-ref -d refs/heads/invalid-committer || true git update-ref -d refs/heads/invalid-committer || true