mirror of
https://github.com/git/git
synced 2024-08-28 03:59:25 +00:00
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>
This commit is contained in:
parent
f7cc77d78b
commit
de2eb7f694
23
fsck-cache.c
23
fsck-cache.c
|
@ -16,6 +16,7 @@ static int show_tags = 0;
|
||||||
static int show_unreachable = 0;
|
static int show_unreachable = 0;
|
||||||
static int standalone = 0;
|
static int standalone = 0;
|
||||||
static int check_full = 0;
|
static int check_full = 0;
|
||||||
|
static int check_strict = 0;
|
||||||
static int keep_cache_objects = 0;
|
static int keep_cache_objects = 0;
|
||||||
static unsigned char head_sha1[20];
|
static unsigned char head_sha1[20];
|
||||||
|
|
||||||
|
@ -131,7 +132,8 @@ static int fsck_tree(struct tree *item)
|
||||||
* bits..
|
* bits..
|
||||||
*/
|
*/
|
||||||
case S_IFREG | 0664:
|
case S_IFREG | 0664:
|
||||||
break;
|
if (!check_strict)
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
printf("tree %s has entry %o %s\n",
|
printf("tree %s has entry %o %s\n",
|
||||||
sha1_to_hex(item->object.sha1),
|
sha1_to_hex(item->object.sha1),
|
||||||
|
@ -168,6 +170,21 @@ static int fsck_tree(struct tree *item)
|
||||||
|
|
||||||
static int fsck_commit(struct commit *commit)
|
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);
|
free(commit->buffer);
|
||||||
commit->buffer = NULL;
|
commit->buffer = NULL;
|
||||||
if (!commit->tree)
|
if (!commit->tree)
|
||||||
|
@ -400,6 +417,10 @@ int main(int argc, char **argv)
|
||||||
check_full = 1;
|
check_full = 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (!strcmp(arg, "--strict")) {
|
||||||
|
check_strict = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (*arg == '-')
|
if (*arg == '-')
|
||||||
usage("git-fsck-cache [--tags] [[--unreachable] [--cache] [--standalone | --full] <head-sha1>*]");
|
usage("git-fsck-cache [--tags] [[--unreachable] [--cache] [--standalone | --full] <head-sha1>*]");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue