X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=mktag.c;h=23288781cf6caad62253130f75112e18eb4905aa;hb=afb4ff206967c6b3e481994cc6d0d86139792169;hp=8605802d388f348cfbecdefefceb01089e2b6a58;hpb=a3df180138b85a603656582bde6df757095618cf;p=git.git diff --git a/mktag.c b/mktag.c index 8605802d..23288781 100644 --- 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 @@ -25,20 +26,14 @@ 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,7 +43,7 @@ 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) return -1; @@ -98,6 +93,12 @@ 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; } @@ -111,14 +112,22 @@ int main(int argc, char **argv) if (argc != 1) usage("cat | git-mktag"); + setup_git_directory(); + // Read the signature - size = read(0, buffer, MAXSIZE); + size = 0; + for (;;) { + int ret = xread(0, buffer + size, MAXSIZE - size); + if (ret <= 0) + break; + size += ret; + } - // Verify it for some basic sanity: it needs to start with "object \ntype " + // Verify it for some basic sanity: it needs to start with "object \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"); printf("%s\n", sha1_to_hex(result_sha1)); return 0;