Browse Source

git-fsck-cache.c: check commit objects more carefully

We historically used to be very careful in fsck-cache, but when it was
re-written to use "parse_object()" instead of parsing everything by
hand, it lost a bit of the checks.  This, together with the previous
commit, should make it do more proper commit object syntax checks.

Also add a "--strict" flag, which warns about the old-style "0664" file
mode bits, which shouldn't exist in modern trees, but that happened
early on in git trees and that the default git-fsck-cache thus silently
accepts.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
maint
Linus Torvalds 20 years ago committed by Junio C Hamano
parent
commit
de2eb7f694
  1. 23
      fsck-cache.c

23
fsck-cache.c

@ -16,6 +16,7 @@ static int show_tags = 0; @@ -16,6 +16,7 @@ static int show_tags = 0;
static int show_unreachable = 0;
static int standalone = 0;
static int check_full = 0;
static int check_strict = 0;
static int keep_cache_objects = 0;
static unsigned char head_sha1[20];

@ -131,7 +132,8 @@ static int fsck_tree(struct tree *item) @@ -131,7 +132,8 @@ static int fsck_tree(struct tree *item)
* bits..
*/
case S_IFREG | 0664:
break;
if (!check_strict)
break;
default:
printf("tree %s has entry %o %s\n",
sha1_to_hex(item->object.sha1),
@ -168,6 +170,21 @@ static int fsck_tree(struct tree *item) @@ -168,6 +170,21 @@ static int fsck_tree(struct tree *item)

static int fsck_commit(struct commit *commit)
{
char *buffer = commit->buffer;
unsigned char sha1[20];

if (memcmp(buffer, "tree ", 5))
return -1;
if (get_sha1_hex(buffer+5, sha1) || buffer[45] != '\n')
return -1;
buffer += 46;
while (!memcmp(buffer, "parent ", 7)) {
if (get_sha1_hex(buffer+7, sha1) || buffer[47] != '\n')
return -1;
buffer += 48;
}
if (memcmp(buffer, "author ", 7))
return -1;
free(commit->buffer);
commit->buffer = NULL;
if (!commit->tree)
@ -400,6 +417,10 @@ int main(int argc, char **argv) @@ -400,6 +417,10 @@ int main(int argc, char **argv)
check_full = 1;
continue;
}
if (!strcmp(arg, "--strict")) {
check_strict = 1;
continue;
}
if (*arg == '-')
usage("git-fsck-cache [--tags] [[--unreachable] [--cache] [--standalone | --full] <head-sha1>*]");
}

Loading…
Cancel
Save