git-fsck-cache.c: check commit objects more carefully
authorLinus Torvalds <torvalds@g5.osdl.org>
Wed, 27 Jul 2005 22:16:03 +0000 (15:16 -0700)
committerJunio C Hamano <junkio@cox.net>
Thu, 28 Jul 2005 01:57:03 +0000 (18:57 -0700)
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>
fsck-cache.c

index 8e21bf1..c660391 100644 (file)
@@ -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 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];
 
 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:
                 * 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),
                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)
 {
 
 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)
        free(commit->buffer);
        commit->buffer = NULL;
        if (!commit->tree)
@@ -400,6 +417,10 @@ int main(int argc, char **argv)
                        check_full = 1;
                        continue;
                }
                        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>*]");
        }
                if (*arg == '-')
                        usage("git-fsck-cache [--tags] [[--unreachable] [--cache] [--standalone | --full] <head-sha1>*]");
        }