diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2005-07-27 15:16:03 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2005-07-27 18:57:03 -0700 |
commit | de2eb7f694da6396828e52588c9807a948a039a0 (patch) | |
tree | 98cd90b0a21758cc28625e1c95150a70ae1e7992 /fsck-cache.c | |
parent | Make "parse_commit()" be a lot more careful (diff) | |
download | tgif-de2eb7f694da6396828e52588c9807a948a039a0.tar.xz |
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>
Diffstat (limited to 'fsck-cache.c')
-rw-r--r-- | fsck-cache.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/fsck-cache.c b/fsck-cache.c index 8e21bf1327..c6603919cb 100644 --- a/fsck-cache.c +++ b/fsck-cache.c @@ -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) * 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) 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) 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>*]"); } |