remove the artificial restriction tagsize < 8kb
[gitweb.git] / mktag.c
diff --git a/mktag.c b/mktag.c
index 8605802d388f348cfbecdefefceb01089e2b6a58..f1598dbd215811ead04d4f02c4d29012db699ac9 100644 (file)
--- a/mktag.c
+++ b/mktag.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "tag.h"
 
 /*
  * A signature file has a very simple fixed format: three lines
 static int verify_object(unsigned char *sha1, const char *expected_type)
 {
        int ret = -1;
-       unsigned long mapsize;
-       void *map = map_sha1_file(sha1, &mapsize);
-
-       if (map) {
-               char type[100];
-               unsigned long size;
-               void *buffer = unpack_sha1_file(map, mapsize, type, &size);
-
-               if (buffer) {
-                       if (!strcmp(type, expected_type))
-                               ret = check_sha1_signature(sha1, buffer, size, type);
-                       free(buffer);
-               }
-               munmap(map, mapsize);
+       char type[100];
+       unsigned long size;
+       void *buffer = read_sha1_file(sha1, type, &size);
+
+       if (buffer) {
+               if (!strcmp(type, expected_type))
+                       ret = check_sha1_signature(sha1, buffer, size, type);
+               free(buffer);
        }
        return ret;
 }
@@ -48,9 +43,9 @@ static int verify_tag(char *buffer, unsigned long size)
        int typelen;
        char type[20];
        unsigned char sha1[20];
-       const char *object, *type_line, *tag_line;
+       const char *object, *type_line, *tag_line, *tagger_line;
 
-       if (size < 64 || size > MAXSIZE-1)
+       if (size < 64)
                return -1;
        buffer[size] = 0;
 
@@ -98,28 +93,41 @@ static int verify_tag(char *buffer, unsigned long size)
                return -1;
        }
 
+       /* Verify the tagger line */
+       tagger_line = tag_line;
+
+       if (memcmp(tagger_line, "tagger", 6) || (tagger_line[6] == '\n'))
+               return -1;
+
        /* The actual stuff afterwards we don't care about.. */
        return 0;
 }
 
 int main(int argc, char **argv)
 {
-       unsigned long size;
-       char buffer[MAXSIZE];
+       unsigned long size = 4096;
+       char *buffer = malloc(size);
        unsigned char result_sha1[20];
 
        if (argc != 1)
                usage("cat <signaturefile> | git-mktag");
 
-       // Read the signature
-       size = read(0, buffer, MAXSIZE);
+       setup_git_directory();
+
+       if (read_pipe(0, &buffer, &size)) {
+               free(buffer);
+               die("could not read from stdin");
+       }
 
-       // Verify it for some basic sanity: it needs to start with "object <sha1>\ntype "
+       // Verify it for some basic sanity: it needs to start with "object <sha1>\ntype\ntagger "
        if (verify_tag(buffer, size) < 0)
                die("invalid tag signature file");
 
-       if (write_sha1_file(buffer, size, "tag", result_sha1) < 0)
+       if (write_sha1_file(buffer, size, tag_type, result_sha1) < 0)
                die("unable to write tag file");
+
+       free(buffer);
+
        printf("%s\n", sha1_to_hex(result_sha1));
        return 0;
 }