1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-12 08:16:08 +02:00

Fix packed_delta_info() that was broken by the delta header packing change

Pointed out by Junio.
This commit is contained in:
Linus Torvalds 2005-06-28 22:42:45 -07:00
parent 01247d8742
commit e5e3e0f500

View File

@ -592,6 +592,22 @@ void * unpack_sha1_file(void *map, unsigned long mapsize, char *type, unsigned l
return unpack_sha1_rest(&stream, hdr, *size);
}
static unsigned long parse_delta_size(unsigned char **p)
{
unsigned char c;
unsigned long size = 0;
unsigned shift = 0;
unsigned char *data = *p;
do {
c = *data++;
size += (c & 0x7f) << shift;
shift += 7;
} while (c & 0x80);
*p = data;
return size;
}
static int packed_delta_info(unsigned char *base_sha1,
unsigned long delta_size,
unsigned long left,
@ -600,8 +616,6 @@ static int packed_delta_info(unsigned char *base_sha1,
{
unsigned char *data;
unsigned char delta_head[64];
int i;
unsigned char cmd;
unsigned long data_size, result_size, base_size, verify_base_size;
z_stream stream;
int st;
@ -631,24 +645,8 @@ static int packed_delta_info(unsigned char *base_sha1,
* the result size. Verify the base size while we are at it.
*/
data = delta_head;
verify_base_size = i = 0;
cmd = *data++;
while (cmd) {
if (cmd & 1)
verify_base_size |= *data++ << i;
i += 8;
cmd >>= 1;
}
/* Read the result size */
result_size = i = 0;
cmd = *data++;
while (cmd) {
if (cmd & 1)
result_size |= *data++ << i;
i += 8;
cmd >>= 1;
}
verify_base_size = parse_delta_size(&data);
result_size = parse_delta_size(&data);
if (verify_base_size != base_size)
die("delta base size mismatch");