Make git-fsck-cache check HEAD integrity
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.
This commit is contained in:
parent
6da4016aea
commit
c33303839c
26
fsck-cache.c
26
fsck-cache.c
@ -342,6 +342,31 @@ static void fsck_object_dir(const char *path)
|
|||||||
fsck_sha1_list();
|
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 main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int i, heads;
|
int i, heads;
|
||||||
@ -382,6 +407,7 @@ int main(int argc, char **argv)
|
|||||||
if (standalone)
|
if (standalone)
|
||||||
unsetenv("GIT_ALTERNATE_OBJECT_DIRECTORIES");
|
unsetenv("GIT_ALTERNATE_OBJECT_DIRECTORIES");
|
||||||
|
|
||||||
|
fsck_head_link();
|
||||||
fsck_object_dir(get_object_directory());
|
fsck_object_dir(get_object_directory());
|
||||||
if (check_full) {
|
if (check_full) {
|
||||||
int j;
|
int j;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user