Commit 6f2856f308918455563413d012e4c4958e57ab40

Brodie Rao 2011-10-05T15:17:37

signature: don't blow up trying to parse names containing '>' When trying to find the end of an email, instead of starting at the beginning of the signature, we start at the end of the name (after the first '<'). This brings libgit2 more in line with Git's behavior when reading out existing signatures. However, note that Git does not allow names like these through the usual porcelain; instead, it silently strips any '>' characters it sees.

diff --git a/src/signature.c b/src/signature.c
index ebb56d7..388e8d9 100644
--- a/src/signature.c
+++ b/src/signature.c
@@ -279,7 +279,7 @@ int git_signature__parse(git_signature *sig, const char **buffer_out,
 	if ((name_end = strchr(buffer, '<')) == NULL)
 		return git__throw(GIT_EOBJCORRUPTED, "Failed to parse signature. Cannot find '<' in signature");
 
-	if ((email_end = strchr(buffer, '>')) == NULL)
+	if ((email_end = strchr(name_end, '>')) == NULL)
 		return git__throw(GIT_EOBJCORRUPTED, "Failed to parse signature. Cannot find '>' in signature");
 
 	if (email_end < name_end)
diff --git a/tests/t04-commit.c b/tests/t04-commit.c
index 58d24bf..3fb4d37 100644
--- a/tests/t04-commit.c
+++ b/tests/t04-commit.c
@@ -412,6 +412,14 @@ BEGIN_TEST(parse1, "parse the signature line in a commit")
 		1234567890,
 		0);
 
+	TEST_SIGNATURE_PASS(
+		"author A U Thor> <author@example.com> and others 1234567890\n",
+		"author ",
+		"A U Thor>",
+		"author@example.com",
+		1234567890,
+		0);
+
 	TEST_SIGNATURE_FAIL(
 		"committer Vicent Marti tanoku@gmail.com> 123456 -0100 \n",
 		"committer ");