diff options
-rw-r--r-- | src/tag.c | 5 | ||||
-rw-r--r-- | tests/resources/bad_tag.git/HEAD | 1 | ||||
-rw-r--r-- | tests/resources/bad_tag.git/config | 5 | ||||
-rw-r--r-- | tests/resources/bad_tag.git/objects/pack/pack-7a28f4e000a17f49a41d7a79fc2f762a8a7d9164.idx | bin | 0 -> 1268 bytes | |||
-rw-r--r-- | tests/resources/bad_tag.git/objects/pack/pack-7a28f4e000a17f49a41d7a79fc2f762a8a7d9164.pack | bin | 0 -> 596 bytes | |||
-rw-r--r-- | tests/resources/bad_tag.git/packed-refs | 3 | ||||
-rw-r--r-- | tests/t08-tag.c | 18 |
7 files changed, 28 insertions, 4 deletions
@@ -126,11 +126,8 @@ static int parse_tag_buffer(git_tag *tag, const char *buffer, const char *buffer if (tag->tagger == NULL) return GIT_ENOMEM; - if ((error = git_signature__parse(tag->tagger, &buffer, buffer_end, "tagger ", '\n')) != 0) { - free(tag->tag_name); - git_signature_free(tag->tagger); + if ((error = git_signature__parse(tag->tagger, &buffer, buffer_end, "tagger ", '\n')) != 0) return git__rethrow(error, "Failed to parse tag"); - } if( *buffer != '\n' ) return git__throw(GIT_EOBJCORRUPTED, "Failed to parse tag. No new line before message"); diff --git a/tests/resources/bad_tag.git/HEAD b/tests/resources/bad_tag.git/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/tests/resources/bad_tag.git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/tests/resources/bad_tag.git/config b/tests/resources/bad_tag.git/config new file mode 100644 index 000000000..2f8958058 --- /dev/null +++ b/tests/resources/bad_tag.git/config @@ -0,0 +1,5 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + logallrefupdates = true diff --git a/tests/resources/bad_tag.git/objects/pack/pack-7a28f4e000a17f49a41d7a79fc2f762a8a7d9164.idx b/tests/resources/bad_tag.git/objects/pack/pack-7a28f4e000a17f49a41d7a79fc2f762a8a7d9164.idx Binary files differnew file mode 100644 index 000000000..c404aa15b --- /dev/null +++ b/tests/resources/bad_tag.git/objects/pack/pack-7a28f4e000a17f49a41d7a79fc2f762a8a7d9164.idx diff --git a/tests/resources/bad_tag.git/objects/pack/pack-7a28f4e000a17f49a41d7a79fc2f762a8a7d9164.pack b/tests/resources/bad_tag.git/objects/pack/pack-7a28f4e000a17f49a41d7a79fc2f762a8a7d9164.pack Binary files differnew file mode 100644 index 000000000..90eac5032 --- /dev/null +++ b/tests/resources/bad_tag.git/objects/pack/pack-7a28f4e000a17f49a41d7a79fc2f762a8a7d9164.pack diff --git a/tests/resources/bad_tag.git/packed-refs b/tests/resources/bad_tag.git/packed-refs new file mode 100644 index 000000000..f9fd2fd4a --- /dev/null +++ b/tests/resources/bad_tag.git/packed-refs @@ -0,0 +1,3 @@ +# pack-refs with: peeled +eda9f45a2a98d4c17a09d681d88569fa4ea91755 refs/tags/e90810b +^e90810b8df3e80c413d903f631643c716887138d diff --git a/tests/t08-tag.c b/tests/t08-tag.c index b0d4af87b..079a9e0a8 100644 --- a/tests/t08-tag.c +++ b/tests/t08-tag.c @@ -30,6 +30,7 @@ static const char *tag1_id = "b25fa35b38051e4ae45d4222e795f9df2e43f1d1"; static const char *tag2_id = "7b4384978d2493e851f9cca7858815fac9b10980"; static const char *tagged_commit = "e90810b8df3e80c413d903f631643c716887138d"; +static const char *bad_tag_id = "eda9f45a2a98d4c17a09d681d88569fa4ea91755"; BEGIN_TEST(read0, "read and parse a tag from the repository") git_repository *repo; @@ -106,6 +107,22 @@ BEGIN_TEST(read2, "list all tag names from the repository matching a specified p git_repository_free(repo); END_TEST +#define BAD_TAG_REPOSITORY_FOLDER TEST_RESOURCES "/bad_tag.git/" + +BEGIN_TEST(read3, "read and parse a tag without a tagger field") + git_repository *repo; + git_tag *bad_tag; + git_oid id; + + must_pass(git_repository_open(&repo, BAD_TAG_REPOSITORY_FOLDER)); + + git_oid_fromstr(&id, bad_tag_id); + + must_fail(git_tag_lookup(&bad_tag, repo, &id)); + + git_repository_free(repo); +END_TEST + #define TAGGER_NAME "Vicent Marti" #define TAGGER_EMAIL "vicent@github.com" @@ -304,6 +321,7 @@ BEGIN_SUITE(tag) ADD_TEST(read0); ADD_TEST(read1); ADD_TEST(read2); + ADD_TEST(read3); ADD_TEST(write0); ADD_TEST(write2); |