Nicolas, I am sorry for not including you in the first mail. Just before Junio included you, there were these 2 mails http://www.mail-archive.com/git@xxxxxxxxxxxxxxx/msg34101.html http://www.mail-archive.com/git@xxxxxxxxxxxxxxx/msg34103.html Stefan On 08/15/2013 11:43 PM, Junio C Hamano wrote: > Forwarding to the area expert... > > Stefan Beller <stefanbeller@xxxxxxxxxxxxxx> writes: > >> When checking the previous lines in that function, we can deduct that >> hsize must always be smaller than (1u<<31), since 506049c7df2c6 >> (fix >4GiB source delta assertion failure), because the entries is >> capped at an upper bound of 0xfffffffeU, so hsize contains a maximum >> value of 0x3fffffff, which is smaller than (1u<<31), so i will never >> be larger than 31. >> >> Signed-off-by: Stefan Beller <stefanbeller@xxxxxxxxxxxxxx> >> --- >> diff-delta.c | 9 ++++++++- >> 1 file changed, 8 insertions(+), 1 deletion(-) >> >> diff --git a/diff-delta.c b/diff-delta.c >> index 93385e1..54da95b 100644 >> --- a/diff-delta.c >> +++ b/diff-delta.c >> @@ -154,8 +154,15 @@ struct delta_index * create_delta_index(const void *buf, unsigned long bufsize) >> */ >> entries = 0xfffffffeU / RABIN_WINDOW; >> } >> + >> + /* >> + * Do not check i < 31 in the loop, because the assignement >> + * previous to the loop makes sure, hsize is definitely >> + * smaller than 1<<31, hence the loop will always stop >> + * before i exceeds 31 resulting in an infinite loop. >> + */ >> hsize = entries / 4; >> - for (i = 4; (1u << i) < hsize && i < 31; i++); >> + for (i = 4; (1u << i) < hsize; i++); >> hsize = 1 << i; >> hmask = hsize - 1;
Attachment:
signature.asc
Description: OpenPGP digital signature