summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott J. Goldman <scottjg@github.com>2013-01-22 15:49:51 -0800
committerScott J. Goldman <scottjg@github.com>2013-01-22 15:49:51 -0800
commitcb35094be3c1dbe369454118e801e703d70c4a33 (patch)
tree39b48c5a56d0d0954c47394ebea1ea999e359171
parent2a707d0e24e206666626ae858e5ba618ffef0547 (diff)
downloadlibgit2-cb35094be3c1dbe369454118e801e703d70c4a33.tar.gz
Allow peeled references without trailing newline at end of file
Also ammends one of the tag tests to make sure it's working.
-rw-r--r--src/refs.c12
-rw-r--r--tests-clar/object/tag/read.c4
-rw-r--r--tests-clar/resources/bad_tag.git/packed-refs2
3 files changed, 14 insertions, 4 deletions
diff --git a/src/refs.c b/src/refs.c
index 4934a0309..52e0adac6 100644
--- a/src/refs.c
+++ b/src/refs.c
@@ -328,7 +328,7 @@ static int packed_parse_peel(
if (git__prefixcmp(tag_ref->name, GIT_REFS_TAGS_DIR) != 0)
goto corrupt;
- if (buffer + GIT_OID_HEXSZ >= buffer_end)
+ if (buffer + GIT_OID_HEXSZ > buffer_end)
goto corrupt;
/* Is this a valid object id? */
@@ -339,10 +339,14 @@ static int packed_parse_peel(
if (*buffer == '\r')
buffer++;
- if (*buffer != '\n')
- goto corrupt;
+ if (buffer != buffer_end) {
+ if (*buffer == '\n')
+ buffer++;
+ else
+ goto corrupt;
+ }
- *buffer_out = buffer + 1;
+ *buffer_out = buffer;
return 0;
corrupt:
diff --git a/tests-clar/object/tag/read.c b/tests-clar/object/tag/read.c
index 53272e91c..6dab2a9a9 100644
--- a/tests-clar/object/tag/read.c
+++ b/tests-clar/object/tag/read.c
@@ -62,6 +62,7 @@ void test_object_tag_read__parse_without_tagger(void)
git_tag *bad_tag;
git_commit *commit;
git_oid id, id_commit;
+ git_strarray ref_list;
// TODO: This is a little messy
cl_git_pass(git_repository_open(&bad_tag_repo, cl_fixture("bad_tag.git")));
@@ -81,6 +82,9 @@ void test_object_tag_read__parse_without_tagger(void)
cl_assert(git_oid_cmp(&id_commit, git_commit_id(commit)) == 0);
+ cl_git_pass(git_reference_list(&ref_list, bad_tag_repo, GIT_REF_LISTALL));
+
+ git_strarray_free(&ref_list);
git_tag_free(bad_tag);
git_commit_free(commit);
git_repository_free(bad_tag_repo);
diff --git a/tests-clar/resources/bad_tag.git/packed-refs b/tests-clar/resources/bad_tag.git/packed-refs
index f9fd2fd4a..9da16459b 100644
--- a/tests-clar/resources/bad_tag.git/packed-refs
+++ b/tests-clar/resources/bad_tag.git/packed-refs
@@ -1,3 +1,5 @@
# pack-refs with: peeled
eda9f45a2a98d4c17a09d681d88569fa4ea91755 refs/tags/e90810b
^e90810b8df3e80c413d903f631643c716887138d
+d3bacb8d3ff25876a961b1963b6515170d0151ab refs/tags/hello
+^6dcf9bf7541ee10456529833502442f385010c3d \ No newline at end of file