char type[20];
unsigned char sha1[20];
const char *object, *type_line, *tag_line, *tagger_line, *lb, *rb;
+ size_t len;
if (size < 84)
return error("wanna fool me ? you obviously got the size wrong !");
/* Verify the tagger line */
tagger_line = tag_line;
- if (memcmp(tagger_line, "tagger ", 7) || (tagger_line[7] == '\n'))
+ if (memcmp(tagger_line, "tagger ", 7))
return error("char" PD_FMT ": could not find \"tagger \"",
tagger_line - buffer);
/*
* Check for correct form for name and email
* i.e. " <" followed by "> " on _this_ line
+ * No angle brackets within the name or email address fields.
+ * No spaces within the email address field.
*/
tagger_line += 7;
if (!(lb = strstr(tagger_line, " <")) || !(rb = strstr(lb+2, "> ")) ||
- strchr(tagger_line, '\n') < rb)
- return error("char" PD_FMT ": malformed tagger",
+ strpbrk(tagger_line, "<>\n") != lb+1 ||
+ strpbrk(lb+2, "><\n ") != rb)
+ return error("char" PD_FMT ": malformed tagger field",
tagger_line - buffer);
/* Check for author name, at least one character, space is acceptable */
return error("char" PD_FMT ": missing tagger name",
tagger_line - buffer);
- /* timestamp */
+ /* timestamp, 1 or more digits followed by space */
tagger_line = rb + 2;
- if (*tagger_line == ' ')
- return error("char" PD_FMT ": malformed tag timestamp",
+ if (!(len = strspn(tagger_line, "0123456789")))
+ return error("char" PD_FMT ": missing tag timestamp",
tagger_line - buffer);
- for (;;) {
- unsigned char c = *tagger_line++;
- if (c == ' ')
- break;
- if (isdigit(c))
- continue;
+ tagger_line += len;
+ if (*tagger_line != ' ')
return error("char" PD_FMT ": malformed tag timestamp",
tagger_line - buffer);
- }
+ tagger_line++;
/* timezone, 5 digits [+-]hhmm, max. 1400 */
if (!((tagger_line[0] == '+' || tagger_line[0] == '-') &&
- isdigit(tagger_line[1]) && isdigit(tagger_line[2]) &&
- isdigit(tagger_line[3]) && isdigit(tagger_line[4]) &&
+ strspn(tagger_line+1, "0123456789") == 4 &&
tagger_line[5] == '\n' && atoi(tagger_line+1) <= 1400))
return error("char" PD_FMT ": malformed tag timezone",
tagger_line - buffer);
'^error: char70: could not find "tagger "$'
############################################################
-# 13. detect missing tag author name
+# 13. disallow missing tag author name
cat >tag.sig <<EOF
object $head
This is filler
EOF
-check_verify_failure 'detect missing tag author name' \
+check_verify_failure 'disallow missing tag author name' \
'^error: char77: missing tagger name$'
############################################################
-# 14. detect missing tag author name
+# 14. disallow missing tag author name
cat >tag.sig <<EOF
object $head
EOF
-check_verify_failure 'detect malformed tagger' \
- '^error: char77: malformed tagger$'
+check_verify_failure 'disallow malformed tagger' \
+ '^error: char77: malformed tagger field$'
############################################################
# 15. allow empty tag email
'git-mktag <tag.sig >.git/refs/tags/mytag 2>message'
############################################################
-# 16. detect missing tag timestamp
+# 16. disallow spaces in tag email
+
+cat >tag.sig <<EOF
+object $head
+type commit
+tag mytag
+tagger T A Gger <tag ger@example.com> 0 +0000
+
+EOF
+
+check_verify_failure 'disallow spaces in tag email' \
+ '^error: char77: malformed tagger field$'
+
+############################################################
+# 17. disallow missing tag timestamp
cat >tag.sig <<EOF
object $head
EOF
-check_verify_failure 'detect missing tag timestamp' \
- '^error: char107: malformed tag timestamp$'
+check_verify_failure 'disallow missing tag timestamp' \
+ '^error: char107: missing tag timestamp$'
############################################################
-# 17. detect invalid tag timestamp
+# 18. detect invalid tag timestamp1
cat >tag.sig <<EOF
object $head
EOF
-check_verify_failure 'detect invalid tag timestamp' \
- '^error: char108: malformed tag timestamp$'
+check_verify_failure 'detect invalid tag timestamp1' \
+ '^error: char107: missing tag timestamp$'
############################################################
-# 18. detect invalid tag timezone
+# 19. detect invalid tag timestamp2
+
+cat >tag.sig <<EOF
+object $head
+type commit
+tag mytag
+tagger T A Gger <tagger@example.com> 2008-03-31T12:20:15-0500
+
+EOF
+
+check_verify_failure 'detect invalid tag timestamp2' \
+ '^error: char111: malformed tag timestamp$'
+
+############################################################
+# 20. detect invalid tag timezone1
cat >tag.sig <<EOF
object $head
EOF
-check_verify_failure 'detect invalid tag timezone' \
+check_verify_failure 'detect invalid tag timezone1' \
+ '^error: char118: malformed tag timezone$'
+
+############################################################
+# 21. detect invalid tag timezone2
+
+cat >tag.sig <<EOF
+object $head
+type commit
+tag mytag
+tagger T A Gger <tagger@example.com> 1206478233 + 30
+
+EOF
+
+check_verify_failure 'detect invalid tag timezone2' \
+ '^error: char118: malformed tag timezone$'
+
+############################################################
+# 22. detect invalid tag timezone3
+
+cat >tag.sig <<EOF
+object $head
+type commit
+tag mytag
+tagger T A Gger <tagger@example.com> 1206478233 -1430
+
+EOF
+
+check_verify_failure 'detect invalid tag timezone3' \
'^error: char118: malformed tag timezone$'
############################################################
-# 19. detect invalid header entry
+# 23. detect invalid header entry
cat >tag.sig <<EOF
object $head
'^error: char124: trailing garbage in tag header$'
############################################################
-# 20. create valid tag
+# 24. create valid tag
cat >tag.sig <<EOF
object $head
'git-mktag <tag.sig >.git/refs/tags/mytag 2>message'
############################################################
-# 21. check mytag
+# 25. check mytag
test_expect_success \
'check mytag' \