diff options
author | Junio C Hamano <gitster@pobox.com> | 2017-10-03 15:42:49 +0900 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2017-10-03 15:42:49 +0900 |
commit | bb3afad386aa2852c2ea86ac50ba33e770ee7efc (patch) | |
tree | 84b24b23472634ff3c3597b9ab863af989d004df /path.c | |
parent | cb1083ca23c2f78140b66b925ed0b82fe400eea5 (diff) | |
parent | 0bca165fdb57b032e505161a9450fd5e3edfd19a (diff) | |
download | git-bb3afad386aa2852c2ea86ac50ba33e770ee7efc.tar.gz |
Merge branch 'jk/validate-headref-fix'
Code clean-up.
* jk/validate-headref-fix:
validate_headref: use get_oid_hex for detached HEADs
validate_headref: use skip_prefix for symref parsing
validate_headref: NUL-terminate HEAD buffer
Diffstat (limited to 'path.c')
-rw-r--r-- | path.c | 23 |
1 files changed, 12 insertions, 11 deletions
@@ -637,8 +637,9 @@ void strbuf_git_common_path(struct strbuf *sb, int validate_headref(const char *path) { struct stat st; - char *buf, buffer[256]; - unsigned char sha1[20]; + char buffer[256]; + const char *refname; + struct object_id oid; int fd; ssize_t len; @@ -662,24 +663,24 @@ int validate_headref(const char *path) len = read_in_full(fd, buffer, sizeof(buffer)-1); close(fd); + if (len < 0) + return -1; + buffer[len] = '\0'; + /* * Is it a symbolic ref? */ - if (len < 4) - return -1; - if (!memcmp("ref:", buffer, 4)) { - buf = buffer + 4; - len -= 4; - while (len && isspace(*buf)) - buf++, len--; - if (len >= 5 && !memcmp("refs/", buf, 5)) + if (skip_prefix(buffer, "ref:", &refname)) { + while (isspace(*refname)) + refname++; + if (starts_with(refname, "refs/")) return 0; } /* * Is this a detached HEAD? */ - if (!get_sha1_hex(buffer, sha1)) + if (!get_oid_hex(buffer, &oid)) return 0; return -1; |