Skip to content

Commit

Permalink
Make git-fsck-cache check HEAD integrity
Browse files Browse the repository at this point in the history
In particular, check that it's a symlink, and points to refs/heads/.  We
depend on that these days not only for "git checkout", but also because
fsck and others only check for references in the .git/refs/
subdirectory, not things like HEAD itself.
  • Loading branch information
Linus Torvalds committed Jul 3, 2005
1 parent 6da4016 commit c333038
Showing 1 changed file with 26 additions and 0 deletions.
26 changes: 26 additions & 0 deletions fsck-cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,31 @@ static void fsck_object_dir(const char *path)
fsck_sha1_list();
}

static int fsck_head_link(void)
{
int fd, count;
char hex[40];
unsigned char sha1[20];
static char path[PATH_MAX], link[PATH_MAX];
const char *git_dir = gitenv(GIT_DIR_ENVIRONMENT) ? : DEFAULT_GIT_DIR_ENVIRONMENT;

snprintf(path, sizeof(path), "%s/HEAD", git_dir);
if (readlink(path, link, sizeof(link)) < 0)
return error("HEAD is not a symlink");
if (strncmp("refs/heads/", link, 11))
return error("HEAD points to something strange (%s)", link);
fd = open(path, O_RDONLY);
if (fd < 0)
return error("HEAD: %s", strerror(errno));
count = read(fd, hex, sizeof(hex));
close(fd);
if (count < 0)
return error("HEAD: %s", strerror(errno));
if (count < 40 || get_sha1_hex(hex, sha1))
return error("HEAD: not a valid git pointer");
return 0;
}

int main(int argc, char **argv)
{
int i, heads;
Expand Down Expand Up @@ -382,6 +407,7 @@ int main(int argc, char **argv)
if (standalone)
unsetenv("GIT_ALTERNATE_OBJECT_DIRECTORIES");

fsck_head_link();
fsck_object_dir(get_object_directory());
if (check_full) {
int j;
Expand Down

0 comments on commit c333038

Please sign in to comment.