{"thread":{"id":"7340","subject":"[PATCH] index-pack: more validation checks and cleanups","startedAt":"2007-03-20T21:07:48Z","lastAt":"2007-03-20T21:07:48Z","messageCount":1,"participants":["Nicolas Pitre"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"37640","messageId":"alpine.LFD.0.83.0703201659530.18328@xanadu.home","threadId":"7340","inReplyTo":null,"subject":"[PATCH] index-pack: more validation checks and cleanups","fromName":"Nicolas Pitre","fromEmail":"nico@cam.org","sentAt":"2007-03-20T21:07:48Z","receivedAt":"2007-03-20T21:07:48Z","isPatch":true,"sender":{"key":"nico@fluxnic.net","avatar":"https://avatars.githubusercontent.com/u/702790?v=4"},"body":"When appending objects to a pack, make sure the appended data is really \nwhat we expect instead of simply loading potentially corrupted objects \nand legitimating them by computing a SHA1 of that corrupt data.\n\nWith this the sha1_object() can lose its test_for_collision parameter \nwhich is now redundent.\n\nSigned-off-by: Nicolas Pitre <nico@cam.org>\n---\n\nAgain on top of my latest patch.\n\ndiff --git a/index-pack.c b/index-pack.c\nindex f314937..61eb20e 100644\n--- a/index-pack.c\n+++ b/index-pack.c\n@@ -345,12 +345,10 @@ static int find_delta_children(const union delta_base *base,\n }\n \n static void sha1_object(const void *data, unsigned long size,\n-\t\t\tenum object_type type, unsigned char *sha1,\n-\t\t\tint test_for_collision)\n+\t\t\tenum object_type type, unsigned char *sha1)\n {\n \thash_sha1_file(data, size, typename(type), sha1);\n-\n-\tif (test_for_collision && has_sha1_file(sha1)) {\n+\tif (has_sha1_file(sha1)) {\n \t\tvoid *has_data;\n \t\tenum object_type has_type;\n \t\tunsigned long has_size;\n@@ -381,7 +379,7 @@ static void resolve_delta(struct object_entry *delta_obj, void *base_data,\n \tfree(delta_data);\n \tif (!result)\n \t\tbad_object(delta_obj->offset, \"failed to apply delta\");\n-\tsha1_object(result, result_size, type, delta_obj->sha1, 1);\n+\tsha1_object(result, result_size, type, delta_obj->sha1);\n \tnr_resolved_deltas++;\n \n \thashcpy(delta_base.sha1, delta_obj->sha1);\n@@ -438,7 +436,7 @@ static void parse_pack_objects(unsigned char *sha1)\n \t\t\tdelta->obj_no = i;\n \t\t\tdelta++;\n \t\t} else\n-\t\t\tsha1_object(data, obj->size, obj->type, obj->sha1, 1);\n+\t\t\tsha1_object(data, obj->size, obj->type, obj->sha1);\n \t\tfree(data);\n \t\tif (verbose)\n \t\t\tpercent = display_progress(i+1, nr_objects, percent);\n@@ -541,7 +539,7 @@ static int write_compressed(int fd, void *in, unsigned int size)\n \treturn size;\n }\n \n-static void append_obj_to_pack(void *buf,\n+static void append_obj_to_pack(const unsigned char *sha1, void *buf,\n \t\t\t       unsigned long size, enum object_type type)\n {\n \tstruct object_entry *obj = &objects[nr_objects++];\n@@ -559,7 +557,7 @@ static void append_obj_to_pack(void *buf,\n \twrite_or_die(output_fd, header, n);\n \tobj[1].offset = obj[0].offset + n;\n \tobj[1].offset += write_compressed(output_fd, buf, size);\n-\tsha1_object(buf, size, type, obj->sha1, 0);\n+\thashcpy(obj->sha1, sha1);\n }\n \n static int delta_pos_compare(const void *_a, const void *_b)\n@@ -612,7 +610,9 @@ static void fix_unresolved_deltas(int nr_unresolved)\n \t\t\t\tresolve_delta(child, data, size, type);\n \t\t}\n \n-\t\tappend_obj_to_pack(data, size, type);\n+\t\tif (check_sha1_signature(d->base.sha1, data, size, typename(type)))\n+\t\t\tdie(\"local object %s is corrupt\", sha1_to_hex(d->base.sha1));\n+\t\tappend_obj_to_pack(d->base.sha1, data, size, type);\n \t\tfree(data);\n \t\tif (verbose)\n \t\t\tpercent = display_progress(nr_resolved_deltas,\n"}]}