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@vger.kernel.org/msg34101.html
http://www.mail-archive.com/git@vger.kernel.org/msg34103.html
Stefan
On 08/15/2013 11:43 PM, Junio C Hamano wrote:
Forwarding to the area expert...
Stefan Beller [off-list ref] writes:
quoted
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 <redacted>
---
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;