X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=path.c;h=6395cf23098841c16d993ae7e86b2d8dcff01cd7;hb=ced38ea252cb8b0315f4d2a54648b11c6c090657;hp=066f62195508033a5f72504e4805ea436424296e;hpb=55e268e7ed9638239e80e0fcd5ebe1c875a985fb;p=git.git diff --git a/path.c b/path.c index 066f62195..6395cf230 100644 --- a/path.c +++ b/path.c @@ -90,10 +90,11 @@ int git_mkstemp(char *path, size_t len, const char *template) } -int validate_symref(const char *path) +int validate_headref(const char *path) { struct stat st; char *buf, buffer[256]; + unsigned char sha1[20]; int len, fd; if (lstat(path, &st) < 0) @@ -113,20 +114,29 @@ int validate_symref(const char *path) fd = open(path, O_RDONLY); if (fd < 0) return -1; - len = read(fd, buffer, sizeof(buffer)-1); + len = read_in_full(fd, buffer, sizeof(buffer)-1); close(fd); /* * Is it a symbolic ref? */ - if (len < 4 || memcmp("ref:", buffer, 4)) + if (len < 4) return -1; - buf = buffer + 4; - len -= 4; - while (len && isspace(*buf)) - buf++, len--; - if (len >= 5 && !memcmp("refs/", buf, 5)) + if (!memcmp("ref:", buffer, 4)) { + buf = buffer + 4; + len -= 4; + while (len && isspace(*buf)) + buf++, len--; + if (len >= 5 && !memcmp("refs/", buf, 5)) + return 0; + } + + /* + * Is this a detached HEAD? + */ + if (!get_sha1_hex(buffer, sha1)) return 0; + return -1; } @@ -241,8 +251,8 @@ char *enter_repo(char *path, int strict) return NULL; if (access("objects", X_OK) == 0 && access("refs", X_OK) == 0 && - validate_symref("HEAD") == 0) { - putenv("GIT_DIR=."); + validate_headref("HEAD") == 0) { + setenv("GIT_DIR", ".", 1); check_repository_format(); return path; }