@matheusbsbs / matheus-bagliano / commits / ce3f6dc655
Fork 0

fix multiple issues in index-pack

Since commit 9441b61dc5, two issues affected correct behavior of index-pack: 1) The real_type of a delta object is the 'real_type' of its base, not the 'type' which can be a "delta type". Consequence of this is a corrupted pack index file which only needs to be recreated with a good index-pack command ('git verify-pack' will flag those). 2) The code sequence: result->data = patch_delta(get_base_data(base), base->obj->size, delta_data, delta_size, &result->size); has two issues of its own since base->obj->size should instead be base->size as we want the size of the actual object data and not the size of the delta object it is represented by. Except that simply replacing base->obj->size with base->size won't make the code more correct as the C language doesn't enforce a particular ordering for the evaluation of needed arguments for a function call, hence base->size could be pushed on the stack before get_base_data() which initializes base->size is called. Signed-off-by: Nicolas Pitre <nico@cam.org> Tested-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Nicolas Pitre committed Oct 20, 2008 at 16:46 UTC ce3f6dc655392803a59c9b2f2ec9509fd8061b33
1 file changed +5 -6
index-pack.c
+5 -6
@@ -514,15 +514,14 @@ static void *get_base_data(struct base_data *c)
514 static void resolve_delta(struct object_entry *delta_obj,
515 struct base_data *base, struct base_data *result)
516 {
517 - void *delta_data;
518 - unsigned long delta_size;
517 + void *base_data, *delta_data;
518
520 - delta_obj->real_type = base->obj->type;
519 + delta_obj->real_type = base->obj->real_type;
520 delta_data = get_data_from_pack(delta_obj);
522 - delta_size = delta_obj->size;
521 + base_data = get_base_data(base);
522 result->obj = delta_obj;
524 - result->data = patch_delta(get_base_data(base), base->obj->size,
525 - delta_data, delta_size, &result->size);
523 + result->data = patch_delta(base_data, base->size,
524 + delta_data, delta_obj->size, &result->size);
525 free(delta_data);
526 if (!result->data)
527 bad_object(delta_obj->idx.offset, "failed to apply delta");