From: Junio C Hamano Date: Tue, 3 Oct 2017 06:42:49 +0000 (+0900) Subject: Merge branch 'jk/validate-headref-fix' X-Git-Tag: v2.15.0-rc0~18 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/bb3afad386aa2852c2ea86ac50ba33e770ee7efc?ds=inline;hp=-c 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 --- bb3afad386aa2852c2ea86ac50ba33e770ee7efc diff --combined path.c index b533ec938d,883324b10a..5aa9244eb2 --- a/path.c +++ b/path.c @@@ -9,7 -9,6 +9,7 @@@ #include "worktree.h" #include "submodule-config.h" #include "path.h" +#include "packfile.h" static int get_st_mode_bits(const char *path, int *mode) { @@@ -637,8 -636,9 +637,9 @@@ void strbuf_git_common_path(struct strb 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 -662,24 +663,24 @@@ 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;