Skip to content

Commit

Permalink
Fix packed_delta_info() that was broken by the delta header packing c…
Browse files Browse the repository at this point in the history
…hange

Pointed out by Junio.
  • Loading branch information
Linus Torvalds committed Jun 29, 2005
1 parent 01247d8 commit e5e3e0f
Showing 1 changed file with 18 additions and 20 deletions.
38 changes: 18 additions & 20 deletions sha1_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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;
Expand Down Expand Up @@ -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");

Expand Down

0 comments on commit e5e3e0f

Please sign in to comment.