trim whitespace when parsing loose refs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
diff --git a/src/refs.c b/src/refs.c
index 0e0a491..c602d1b 100644
--- a/src/refs.c
+++ b/src/refs.c
@@ -128,6 +128,7 @@ static int reference_read(
result = git_futils_readbuffer_updated(file_content, path.ptr, mtime, updated);
git_buf_free(&path);
+
return result;
}
@@ -135,12 +136,13 @@ static int loose_parse_symbolic(git_reference *ref, git_buf *file_content)
{
const unsigned int header_len = (unsigned int)strlen(GIT_SYMREF);
const char *refname_start;
- char *eol;
refname_start = (const char *)file_content->ptr;
- if (git_buf_len(file_content) < header_len + 1)
- goto corrupt;
+ if (git_buf_len(file_content) < header_len + 1) {
+ giterr_set(GITERR_REFERENCE, "Corrupted loose reference file");
+ return -1;
+ }
/*
* Assume we have already checked for the header
@@ -151,45 +153,16 @@ static int loose_parse_symbolic(git_reference *ref, git_buf *file_content)
ref->target.symbolic = git__strdup(refname_start);
GITERR_CHECK_ALLOC(ref->target.symbolic);
- /* remove newline at the end of file */
- eol = strchr(ref->target.symbolic, '\n');
- if (eol == NULL)
- goto corrupt;
-
- *eol = '\0';
- if (eol[-1] == '\r')
- eol[-1] = '\0';
-
return 0;
-
-corrupt:
- giterr_set(GITERR_REFERENCE, "Corrupted loose reference file");
- return -1;
}
static int loose_parse_oid(git_oid *oid, git_buf *file_content)
{
- char *buffer;
-
- buffer = (char *)file_content->ptr;
-
- /* File format: 40 chars (OID) + newline */
- if (git_buf_len(file_content) < GIT_OID_HEXSZ + 1)
- goto corrupt;
-
- if (git_oid_fromstr(oid, buffer) < 0)
- goto corrupt;
-
- buffer = buffer + GIT_OID_HEXSZ;
- if (*buffer == '\r')
- buffer++;
-
- if (*buffer != '\n')
- goto corrupt;
-
- return 0;
+ /* File format: 40 chars (OID) */
+ if (git_buf_len(file_content) == GIT_OID_HEXSZ &&
+ git_oid_fromstr(oid, git_buf_cstr(file_content)) == 0)
+ return 0;
-corrupt:
giterr_set(GITERR_REFERENCE, "Corrupted loose reference file");
return -1;
}
@@ -226,6 +199,8 @@ static int loose_lookup(git_reference *ref)
if (!updated)
return 0;
+ git_buf_rtrim(&ref_file);
+
if (ref->flags & GIT_REF_SYMBOLIC) {
git__free(ref->target.symbolic);
ref->target.symbolic = NULL;
@@ -259,6 +234,8 @@ static int loose_lookup_to_packfile(
if (reference_read(&ref_file, NULL, repo->path_repository, name, NULL) < 0)
return -1;
+ git_buf_rtrim(&ref_file);
+
name_len = strlen(name);
ref = git__malloc(sizeof(struct packref) + name_len + 1);
GITERR_CHECK_ALLOC(ref);