Git development
 help / color / mirror / Atom feed
* [PATCH] [Outreachy PATCH] diff-delta: use safe integer arithmetic
@ 2026-10-23  3:56 Srujith A Poojary via GitGitGadget
  2026-10-23  5:04 ` Junio C Hamano
                   ` (4 more replies)
  0 siblings, 5 replies; 19+ messages in thread
From: Srujith A Poojary via GitGitGadget @ 2026-10-23  3:56 UTC (permalink / raw)
  To: git; +Cc: Srujith A Poojary, Srujith A Poojary

From: Srujith A Poojary <poojarysrujith@gmail.com>

Replace manual multiplication and addition in create_delta_index()
with safe integer helpers (st_mult, st_add, st_add3) to prevent
overflows while preserving NULL returns on failure.

Signed-off-by: Srujith A Poojary <poojarysrujith@gmail.com>
---
    [Outreachy PATCH] diff-delta: use safe integer arithmetic

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2276%2Fpoojarysrujith%2Fc-refactor-target-name-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2276/poojarysrujith/c-refactor-target-name-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/2276

 diff-delta.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/diff-delta.c b/diff-delta.c
index 7cbedeb507..45df070ab9 100644
--- a/diff-delta.c
+++ b/diff-delta.c
@@ -162,8 +162,8 @@ struct delta_index * create_delta_index(const void *buf, size_t bufsize)
 	hmask = hsize - 1;
 
 	/* allocate lookup index */
-	memsize = sizeof(*hash) * hsize +
-		  sizeof(*entry) * entries;
+	memsize = st_add(st_mult(sizeof(*hash), hsize),
+				st_mult(sizeof(*entry), entries));
 	mem = malloc(memsize);
 	if (!mem)
 		return NULL;
@@ -258,9 +258,9 @@ struct delta_index * create_delta_index(const void *buf, size_t bufsize)
 	 * Now create the packed index in array form
 	 * rather than linked lists.
 	 */
-	memsize = sizeof(*index)
-		+ sizeof(*packed_hash) * (hsize+1)
-		+ sizeof(*packed_entry) * entries;
+	memsize = st_add3(sizeof(*index),
+			st_mult(sizeof(*packed_hash), hsize + 1),
+			st_mult(sizeof(*packed_entry), entries));
 	mem = malloc(memsize);
 	if (!mem) {
 		free(hash);

base-commit: 47fdf2208c5b94c8cc01c106b8f7c85efb91c926
-- 
gitgitgadget

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [PATCH] [Outreachy PATCH] diff-delta: use safe integer arithmetic
  2026-10-23  3:56 [PATCH] [Outreachy PATCH] diff-delta: use safe integer arithmetic Srujith A Poojary via GitGitGadget
@ 2026-10-23  5:04 ` Junio C Hamano
  2026-10-23  5:29   ` Srujith Poojary
  2026-10-23  5:56 ` [PATCH v2] " Srujith A Poojary via GitGitGadget
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 19+ messages in thread
From: Junio C Hamano @ 2026-10-23  5:04 UTC (permalink / raw)
  To: Srujith A Poojary via GitGitGadget; +Cc: git, Srujith A Poojary

"Srujith A Poojary via GitGitGadget" <gitgitgadget@gmail.com>
writes:

> From: Srujith A Poojary <poojarysrujith@gmail.com>
>
> Replace manual multiplication and addition in create_delta_index()
> with safe integer helpers (st_mult, st_add, st_add3) to prevent
> overflows while preserving NULL returns on failure.

I do not quite understand what the last part of this explanation
wants to say, i.e., "while preserving NULL returns on failure".  It
makes it sound as if the function would return NULL if the integer
helpers detect integer overflow, but I do not think that is what
actually the updated code does at all.  st_add() and friends will
simply die() when overflow happens, so you will not even reach
malloc(), let alone return NULL when the malloc fails.

And if you reply to this review message, please do not top-post.

Thanks.

>
> Signed-off-by: Srujith A Poojary <poojarysrujith@gmail.com>
> ---
>     [Outreachy PATCH] diff-delta: use safe integer arithmetic
>
> Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2276%2Fpoojarysrujith%2Fc-refactor-target-name-v1
> Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2276/poojarysrujith/c-refactor-target-name-v1
> Pull-Request: https://github.com/gitgitgadget/git/pull/2276
>
>  diff-delta.c | 10 +++++-----
>  1 file changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/diff-delta.c b/diff-delta.c
> index 7cbedeb507..45df070ab9 100644
> --- a/diff-delta.c
> +++ b/diff-delta.c
> @@ -162,8 +162,8 @@ struct delta_index * create_delta_index(const void *buf, size_t bufsize)
>  	hmask = hsize - 1;
>  
>  	/* allocate lookup index */
> -	memsize = sizeof(*hash) * hsize +
> -		  sizeof(*entry) * entries;
> +	memsize = st_add(st_mult(sizeof(*hash), hsize),
> +				st_mult(sizeof(*entry), entries));
>  	mem = malloc(memsize);
>  	if (!mem)
>  		return NULL;
> @@ -258,9 +258,9 @@ struct delta_index * create_delta_index(const void *buf, size_t bufsize)
>  	 * Now create the packed index in array form
>  	 * rather than linked lists.
>  	 */
> -	memsize = sizeof(*index)
> -		+ sizeof(*packed_hash) * (hsize+1)
> -		+ sizeof(*packed_entry) * entries;
> +	memsize = st_add3(sizeof(*index),
> +			st_mult(sizeof(*packed_hash), hsize + 1),
> +			st_mult(sizeof(*packed_entry), entries));
>  	mem = malloc(memsize);
>  	if (!mem) {
>  		free(hash);
>
> base-commit: 47fdf2208c5b94c8cc01c106b8f7c85efb91c926

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH] [Outreachy PATCH] diff-delta: use safe integer arithmetic
  2026-10-23  5:04 ` Junio C Hamano
@ 2026-10-23  5:29   ` Srujith Poojary
  2026-10-23 15:30     ` Junio C Hamano
  0 siblings, 1 reply; 19+ messages in thread
From: Srujith Poojary @ 2026-10-23  5:29 UTC (permalink / raw)
  To: Junio C Hamano, Usman Akinyemi; +Cc: Srujith A Poojary via GitGitGadget, git

On Fri, Oct 23, 2026 at 10:34 AM Junio C Hamano <gitster@pobox.com> wrote:
>
> "Srujith A Poojary via GitGitGadget" <gitgitgadget@gmail.com>
> writes:
>
> > From: Srujith A Poojary <poojarysrujith@gmail.com>
> >
> > Replace manual multiplication and addition in create_delta_index()
> > with safe integer helpers (st_mult, st_add, st_add3) to prevent
> > overflows while preserving NULL returns on failure.
>
> I do not quite understand what the last part of this explanation
> wants to say, i.e., "while preserving NULL returns on failure".  It
> makes it sound as if the function would return NULL if the integer
> helpers detect integer overflow, but I do not think that is what
> actually the updated code does at all.  st_add() and friends will
> simply die() when overflow happens, so you will not even reach
> malloc(), let alone return NULL when the malloc fails.
>
> And if you reply to this review message, please do not top-post.
>
> Thanks.
>
> >
> > Signed-off-by: Srujith A Poojary <poojarysrujith@gmail.com>
> > ---
> >     [Outreachy PATCH] diff-delta: use safe integer arithmetic
> >
> > Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2276%2Fpoojarysrujith%2Fc-refactor-target-name-v1
> > Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2276/poojarysrujith/c-refactor-target-name-v1
> > Pull-Request: https://github.com/gitgitgadget/git/pull/2276
> >
> >  diff-delta.c | 10 +++++-----
> >  1 file changed, 5 insertions(+), 5 deletions(-)
> >
> > diff --git a/diff-delta.c b/diff-delta.c
> > index 7cbedeb507..45df070ab9 100644
> > --- a/diff-delta.c
> > +++ b/diff-delta.c
> > @@ -162,8 +162,8 @@ struct delta_index * create_delta_index(const void *buf, size_t bufsize)
> >       hmask = hsize - 1;
> >
> >       /* allocate lookup index */
> > -     memsize = sizeof(*hash) * hsize +
> > -               sizeof(*entry) * entries;
> > +     memsize = st_add(st_mult(sizeof(*hash), hsize),
> > +                             st_mult(sizeof(*entry), entries));
> >       mem = malloc(memsize);
> >       if (!mem)
> >               return NULL;
> > @@ -258,9 +258,9 @@ struct delta_index * create_delta_index(const void *buf, size_t bufsize)
> >        * Now create the packed index in array form
> >        * rather than linked lists.
> >        */
> > -     memsize = sizeof(*index)
> > -             + sizeof(*packed_hash) * (hsize+1)
> > -             + sizeof(*packed_entry) * entries;
> > +     memsize = st_add3(sizeof(*index),
> > +                     st_mult(sizeof(*packed_hash), hsize + 1),
> > +                     st_mult(sizeof(*packed_entry), entries));
> >       mem = malloc(memsize);
> >       if (!mem) {
> >               free(hash);
> >
> > base-commit: 47fdf2208c5b94c8cc01c106b8f7c85efb91c926

Hi Junio,

Thank you for clarifying this. You are right—st_add() and st_mult()
call die() on overflow rather than returning NULL.
I will update the commit message to accurately reflect this behavior
and submit v2.

Best regards,
Srujith

^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH v2] diff-delta: use safe integer arithmetic
  2026-10-23  3:56 [PATCH] [Outreachy PATCH] diff-delta: use safe integer arithmetic Srujith A Poojary via GitGitGadget
  2026-10-23  5:04 ` Junio C Hamano
@ 2026-10-23  5:56 ` Srujith A Poojary via GitGitGadget
  2026-10-23 15:15   ` Phillip Wood
  2026-10-24  3:48 ` [PATCH v3] " Srujith A Poojary via GitGitGadget
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 19+ messages in thread
From: Srujith A Poojary via GitGitGadget @ 2026-10-23  5:56 UTC (permalink / raw)
  To: git; +Cc: Srujith A Poojary, Srujith A Poojary

From: Srujith A Poojary <poojarysrujith@gmail.com>

Replace manual multiplication and addition in create_delta_index()
with safe integer helpers (st_mult, st_add, st_add3) to prevent
overflows.

Signed-off-by: Srujith A Poojary <poojarysrujith@gmail.com>
---
    [Outreachy PATCH] diff-delta: use safe integer arithmetic

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2276%2Fpoojarysrujith%2Fc-refactor-target-name-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2276/poojarysrujith/c-refactor-target-name-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/2276

Range-diff vs v1:

 1:  a0aafe63a7 ! 1:  14ffd630ca [Outreachy PATCH] diff-delta: use safe integer arithmetic
     @@ Metadata
      Author: Srujith A Poojary <poojarysrujith@gmail.com>
      
       ## Commit message ##
     -    [Outreachy PATCH] diff-delta: use safe integer arithmetic
     +    diff-delta: use safe integer arithmetic
      
          Replace manual multiplication and addition in create_delta_index()
          with safe integer helpers (st_mult, st_add, st_add3) to prevent
     -    overflows while preserving NULL returns on failure.
     +    overflows.
      
          Signed-off-by: Srujith A Poojary <poojarysrujith@gmail.com>
      


 diff-delta.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/diff-delta.c b/diff-delta.c
index 7cbedeb507..45df070ab9 100644
--- a/diff-delta.c
+++ b/diff-delta.c
@@ -162,8 +162,8 @@ struct delta_index * create_delta_index(const void *buf, size_t bufsize)
 	hmask = hsize - 1;
 
 	/* allocate lookup index */
-	memsize = sizeof(*hash) * hsize +
-		  sizeof(*entry) * entries;
+	memsize = st_add(st_mult(sizeof(*hash), hsize),
+				st_mult(sizeof(*entry), entries));
 	mem = malloc(memsize);
 	if (!mem)
 		return NULL;
@@ -258,9 +258,9 @@ struct delta_index * create_delta_index(const void *buf, size_t bufsize)
 	 * Now create the packed index in array form
 	 * rather than linked lists.
 	 */
-	memsize = sizeof(*index)
-		+ sizeof(*packed_hash) * (hsize+1)
-		+ sizeof(*packed_entry) * entries;
+	memsize = st_add3(sizeof(*index),
+			st_mult(sizeof(*packed_hash), hsize + 1),
+			st_mult(sizeof(*packed_entry), entries));
 	mem = malloc(memsize);
 	if (!mem) {
 		free(hash);

base-commit: 47fdf2208c5b94c8cc01c106b8f7c85efb91c926
-- 
gitgitgadget

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [PATCH v2] diff-delta: use safe integer arithmetic
  2026-10-23  5:56 ` [PATCH v2] " Srujith A Poojary via GitGitGadget
@ 2026-10-23 15:15   ` Phillip Wood
  2026-10-23 18:49     ` Junio C Hamano
  0 siblings, 1 reply; 19+ messages in thread
From: Phillip Wood @ 2026-10-23 15:15 UTC (permalink / raw)
  To: Srujith A Poojary via GitGitGadget, git; +Cc: Srujith A Poojary

Hi Srujith

On 23/10/2026 06:56, Srujith A Poojary via GitGitGadget wrote:
> From: Srujith A Poojary <poojarysrujith@gmail.com>
> 
> Replace manual multiplication and addition in create_delta_index()
> with safe integer helpers (st_mult, st_add, st_add3) to prevent
> overflows.

Sounds like a good idea

> diff --git a/diff-delta.c b/diff-delta.c
> index 7cbedeb507..45df070ab9 100644
> --- a/diff-delta.c
> +++ b/diff-delta.c
> @@ -162,8 +162,8 @@ struct delta_index * create_delta_index(const void *buf, size_t bufsize)
>   	hmask = hsize - 1;
>   
>   	/* allocate lookup index */
> -	memsize = sizeof(*hash) * hsize +
> -		  sizeof(*entry) * entries;
> +	memsize = st_add(st_mult(sizeof(*hash), hsize),
> +				st_mult(sizeof(*entry), entries));

The alignment is off here, see 
https://github.com/gitgitgadget/git/actions/runs/39906906057/job/120260845179?pr=2276 
for a suggested fix from clang-format. I think you should be able to use 
"git clang-format HEAD^" to fix it.
  >   	mem = malloc(memsize);
>   	if (!mem)
>   		return NULL;
> @@ -258,9 +258,9 @@ struct delta_index * create_delta_index(const void *buf, size_t bufsize)
>   	 * Now create the packed index in array form
>   	 * rather than linked lists.
>   	 */
> -	memsize = sizeof(*index)
> -		+ sizeof(*packed_hash) * (hsize+1)
> -		+ sizeof(*packed_entry) * entries;
> +	memsize = st_add3(sizeof(*index),
> +			st_mult(sizeof(*packed_hash), hsize + 1),

What are the bounds of hsize? Can adding one to it overflow? The 
alignment is off here as well, all the arguments to st_add3() should be 
aligned.

Thanks

Phillip

> +			st_mult(sizeof(*packed_entry), entries));
>   	mem = malloc(memsize);
>   	if (!mem) {
>   		free(hash);
> 
> base-commit: 47fdf2208c5b94c8cc01c106b8f7c85efb91c926


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH] [Outreachy PATCH] diff-delta: use safe integer arithmetic
  2026-10-23  5:29   ` Srujith Poojary
@ 2026-10-23 15:30     ` Junio C Hamano
  2026-10-23 16:56       ` Srujith Poojary
  0 siblings, 1 reply; 19+ messages in thread
From: Junio C Hamano @ 2026-10-23 15:30 UTC (permalink / raw)
  To: Srujith Poojary; +Cc: Usman Akinyemi, Srujith A Poojary via GitGitGadget, git

Srujith Poojary <poojarysrujith@gmail.com> writes:

> Thank you for clarifying this. You are right—st_add() and st_mult()
> call die() on overflow rather than returning NULL.
> I will update the commit message to accurately reflect this behavior
> and submit v2.

Please don't, before making sure if it can overflow.  With the
number of entries capped like this:

	if (bufsize >= 0xffffffffUL)
		entries = 0xfffffffeU / RABIN_WINDOW;

and then computed

	hsize = entries / 4;
	for (i = 4; (1u << i) < hsize; i++);
	hsize = 1 << i;
	/* allocate lookup index */
	memsize = sizeof(*hash) * hsize +
		  sizeof(*entry) * entries;

it may not be possible to overflow size_t even on 32-bit platforms.
I didn't have time to do math yet myself, though.


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH] [Outreachy PATCH] diff-delta: use safe integer arithmetic
  2026-10-23 15:30     ` Junio C Hamano
@ 2026-10-23 16:56       ` Srujith Poojary
  2026-10-23 18:45         ` Junio C Hamano
  0 siblings, 1 reply; 19+ messages in thread
From: Srujith Poojary @ 2026-10-23 16:56 UTC (permalink / raw)
  To: Junio C Hamano, phillip.wood123
  Cc: Usman Akinyemi, Srujith A Poojary via GitGitGadget, git

On Fri, Oct 23, 2026 at 9:00 PM Junio C Hamano <gitster@pobox.com> wrote:
>
> Srujith Poojary <poojarysrujith@gmail.com> writes:
>
> > Thank you for clarifying this. You are right—st_add() and st_mult()
> > call die() on overflow rather than returning NULL.
> > I will update the commit message to accurately reflect this behavior
> > and submit v2.
>
> Please don't, before making sure if it can overflow.  With the
> number of entries capped like this:
>
>         if (bufsize >= 0xffffffffUL)
>                 entries = 0xfffffffeU / RABIN_WINDOW;
>
> and then computed
>
>         hsize = entries / 4;
>         for (i = 4; (1u << i) < hsize; i++);
>         hsize = 1 << i;
>         /* allocate lookup index */
>         memsize = sizeof(*hash) * hsize +
>                   sizeof(*entry) * entries;
>
> it may not be possible to overflow size_t even on 32-bit platforms.
> I didn't have time to do math yet myself, though.
>

Hi Phillip and Junio,

Thank you for the detailed feedback.

I checked the bounds: since entries is capped by (0xffffffu /
RABIN_WINDOW), hsize remains small, making a size_t overflow
impossible even on 32-bit systems.

I ran git clang-format HEAD^ to fix the code alignment as suggested
and updated the patch.

Best regards,
Srujith

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH] [Outreachy PATCH] diff-delta: use safe integer arithmetic
  2026-10-23 16:56       ` Srujith Poojary
@ 2026-10-23 18:45         ` Junio C Hamano
  0 siblings, 0 replies; 19+ messages in thread
From: Junio C Hamano @ 2026-10-23 18:45 UTC (permalink / raw)
  To: Srujith Poojary
  Cc: phillip.wood123, Usman Akinyemi,
	Srujith A Poojary via GitGitGadget, git

Srujith Poojary <poojarysrujith@gmail.com> writes:

> On Fri, Oct 23, 2026 at 9:00 PM Junio C Hamano <gitster@pobox.com> wrote:
>>
>> Srujith Poojary <poojarysrujith@gmail.com> writes:
>>
>> > Thank you for clarifying this. You are right—st_add() and st_mult()
>> > call die() on overflow rather than returning NULL.
>> > I will update the commit message to accurately reflect this behavior
>> > and submit v2.
>>
>> Please don't, before making sure if it can overflow.  With the
>> number of entries capped like this:
>>
>>         if (bufsize >= 0xffffffffUL)
>>                 entries = 0xfffffffeU / RABIN_WINDOW;
>>
>> and then computed
>>
>>         hsize = entries / 4;
>>         for (i = 4; (1u << i) < hsize; i++);
>>         hsize = 1 << i;
>>         /* allocate lookup index */
>>         memsize = sizeof(*hash) * hsize +
>>                   sizeof(*entry) * entries;
>>
>> it may not be possible to overflow size_t even on 32-bit platforms.
>> I didn't have time to do math yet myself, though.
>>
>
> Hi Phillip and Junio,
>
> Thank you for the detailed feedback.
>
> I checked the bounds: since entries is capped by (0xffffffu /
> RABIN_WINDOW), hsize remains small, making a size_t overflow
> impossible even on 32-bit systems.

Hmph, I actually came to a different conclusion, but my math is
probably weaker X-<.

entries is capped by 1^32 / 16 = 1^28, and hsize is capped at 1^26.

sizeof(*hash) is 4 bytes on 32-bit platforms.

struct index_entry has a pointer and an unsigned, i.e. 8 bytes.
struct unpacked_index_entry has the above index_entry plus a
pointer, i.e. 8+4=12 bytes or 16 bytes (with 4-byte padding).
That is the sizeof(*entry).

If "struct unpacked_index_entry" has 4-byte padding to align at
8-byte boundary, then memsize = 4 * 1^26 + 16 * 1^28 can overflow
size_t's range that is 1^32.  If the struct does not have extra
padding, this would fit below 1^32.  We have no guarantee what the
compiler would do, so we need to assume the worst.

Of course it is entirely a different matter if malloc() would allow
such a large allocation even if math does not overflow, but the
focus of this patch is to make sure memsize is computed as a large
allocation in such a case without wrapping around.


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v2] diff-delta: use safe integer arithmetic
  2026-10-23 15:15   ` Phillip Wood
@ 2026-10-23 18:49     ` Junio C Hamano
  2026-10-24  3:44       ` Srujith Poojary
  0 siblings, 1 reply; 19+ messages in thread
From: Junio C Hamano @ 2026-10-23 18:49 UTC (permalink / raw)
  To: Phillip Wood; +Cc: Srujith A Poojary via GitGitGadget, git, Srujith A Poojary

Phillip Wood <phillip.wood123@gmail.com> writes:

>> +	memsize = st_add3(sizeof(*index),
>> +			st_mult(sizeof(*packed_hash), hsize + 1),
>
> What are the bounds of hsize? Can adding one to it overflow? The 
> alignment is off here as well, all the arguments to st_add3() should be 
> aligned.

Very good question, and I think hsize is capped at 1^26 in a code
early in this function, which makes this safe.  It needs to be
explained why it is safe in the log message, though.

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v2] diff-delta: use safe integer arithmetic
  2026-10-23 18:49     ` Junio C Hamano
@ 2026-10-24  3:44       ` Srujith Poojary
  0 siblings, 0 replies; 19+ messages in thread
From: Srujith Poojary @ 2026-10-24  3:44 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: Phillip Wood, Srujith A Poojary via GitGitGadget, git,
	Usman Akinyemi

On Sat, Oct 24, 2026 at 12:19 AM Junio C Hamano <gitster@pobox.com> wrote:
>
> Phillip Wood <phillip.wood123@gmail.com> writes:
>
> >> +    memsize = st_add3(sizeof(*index),
> >> +                    st_mult(sizeof(*packed_hash), hsize + 1),
> >
> > What are the bounds of hsize? Can adding one to it overflow? The
> > alignment is off here as well, all the arguments to st_add3() should be
> > aligned.
>
> Very good question, and I think hsize is capped at 1^26 in a code
> early in this function, which makes this safe.  It needs to be
> explained why it is safe in the log message, though.

Hi Junio,

Thank you for analyzing the struct alignment and memory allocation limits.
I have updated the commit message to explain why st_mult/st_add are
necessary on 32-bit platforms due to padding, as well as documenting
that hsize + 1 is safe because hsize is capped at 2^26.
I also fixed the code formatting using git clang-format HEAD^.

Best regards,
Srujith

^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH v3] diff-delta: use safe integer arithmetic
  2026-10-23  3:56 [PATCH] [Outreachy PATCH] diff-delta: use safe integer arithmetic Srujith A Poojary via GitGitGadget
  2026-10-23  5:04 ` Junio C Hamano
  2026-10-23  5:56 ` [PATCH v2] " Srujith A Poojary via GitGitGadget
@ 2026-10-24  3:48 ` Srujith A Poojary via GitGitGadget
  2026-10-24 16:15   ` Junio C Hamano
  2026-10-24 18:00 ` [PATCH v4] " Srujith A Poojary via GitGitGadget
  2026-10-25 19:20 ` [PATCH v5] " Srujith A Poojary via GitGitGadget
  4 siblings, 1 reply; 19+ messages in thread
From: Srujith A Poojary via GitGitGadget @ 2026-10-24  3:48 UTC (permalink / raw)
  To: git; +Cc: Phillip Wood, Srujith A Poojary, Srujith A Poojary

From: Srujith A Poojary <poojarysrujith@gmail.com>

Replace manual multiplication and addition in create_delta_index()
with safe integer helpers (st_mult, st_add, st_add3) to prevent potential
overflows when computing memory allocation sizes.

On 32-bit platforms, struct alignment padding could cause the total
allocation size calculation to exceed 2^32, making safe integer arithmetic
necessary. Note that hsize + 1 inside st_add3() is safe from overflow
because hsize is capped at 2^26 early in the function.

Signed-off-by: Srujith A Poojary <poojarysrujith@gmail.com>
---
    [Outreachy PATCH] diff-delta: use safe integer arithmetic

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2276%2Fpoojarysrujith%2Fc-refactor-target-name-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2276/poojarysrujith/c-refactor-target-name-v3
Pull-Request: https://github.com/gitgitgadget/git/pull/2276

Range-diff vs v2:

 1:  14ffd630ca ! 1:  d288bfe9e3 diff-delta: use safe integer arithmetic
     @@ Commit message
          diff-delta: use safe integer arithmetic
      
          Replace manual multiplication and addition in create_delta_index()
     -    with safe integer helpers (st_mult, st_add, st_add3) to prevent
     -    overflows.
     +    with safe integer helpers (st_mult, st_add, st_add3) to prevent potential
     +    overflows when computing memory allocation sizes.
     +
     +    On 32-bit platforms, struct alignment padding could cause the total
     +    allocation size calculation to exceed 2^32, making safe integer arithmetic
     +    necessary. Note that hsize + 1 inside st_add3() is safe from overflow
     +    because hsize is capped at 2^26 early in the function.
      
          Signed-off-by: Srujith A Poojary <poojarysrujith@gmail.com>
      
     @@ diff-delta.c: struct delta_index * create_delta_index(const void *buf, size_t bu
      -	memsize = sizeof(*hash) * hsize +
      -		  sizeof(*entry) * entries;
      +	memsize = st_add(st_mult(sizeof(*hash), hsize),
     -+				st_mult(sizeof(*entry), entries));
     ++			 st_mult(sizeof(*entry), entries));
       	mem = malloc(memsize);
       	if (!mem)
       		return NULL;
     @@ diff-delta.c: struct delta_index * create_delta_index(const void *buf, size_t bu
      -		+ sizeof(*packed_hash) * (hsize+1)
      -		+ sizeof(*packed_entry) * entries;
      +	memsize = st_add3(sizeof(*index),
     -+			st_mult(sizeof(*packed_hash), hsize + 1),
     -+			st_mult(sizeof(*packed_entry), entries));
     ++			  st_mult(sizeof(*packed_hash), hsize + 1),
     ++			  st_mult(sizeof(*packed_entry), entries));
       	mem = malloc(memsize);
       	if (!mem) {
       		free(hash);


 diff-delta.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/diff-delta.c b/diff-delta.c
index 7cbedeb507..efebce3aca 100644
--- a/diff-delta.c
+++ b/diff-delta.c
@@ -162,8 +162,8 @@ struct delta_index * create_delta_index(const void *buf, size_t bufsize)
 	hmask = hsize - 1;
 
 	/* allocate lookup index */
-	memsize = sizeof(*hash) * hsize +
-		  sizeof(*entry) * entries;
+	memsize = st_add(st_mult(sizeof(*hash), hsize),
+			 st_mult(sizeof(*entry), entries));
 	mem = malloc(memsize);
 	if (!mem)
 		return NULL;
@@ -258,9 +258,9 @@ struct delta_index * create_delta_index(const void *buf, size_t bufsize)
 	 * Now create the packed index in array form
 	 * rather than linked lists.
 	 */
-	memsize = sizeof(*index)
-		+ sizeof(*packed_hash) * (hsize+1)
-		+ sizeof(*packed_entry) * entries;
+	memsize = st_add3(sizeof(*index),
+			  st_mult(sizeof(*packed_hash), hsize + 1),
+			  st_mult(sizeof(*packed_entry), entries));
 	mem = malloc(memsize);
 	if (!mem) {
 		free(hash);

base-commit: 47fdf2208c5b94c8cc01c106b8f7c85efb91c926
-- 
gitgitgadget

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [PATCH v3] diff-delta: use safe integer arithmetic
  2026-10-24  3:48 ` [PATCH v3] " Srujith A Poojary via GitGitGadget
@ 2026-10-24 16:15   ` Junio C Hamano
  2026-10-24 17:26     ` Srujith Poojary
  0 siblings, 1 reply; 19+ messages in thread
From: Junio C Hamano @ 2026-10-24 16:15 UTC (permalink / raw)
  To: Srujith A Poojary via GitGitGadget; +Cc: git, Phillip Wood, Srujith A Poojary

"Srujith A Poojary via GitGitGadget" <gitgitgadget@gmail.com>
writes:

> From: Srujith A Poojary <poojarysrujith@gmail.com>
>
> Replace manual multiplication and addition in create_delta_index()
> with safe integer helpers (st_mult, st_add, st_add3) to prevent potential
> overflows when computing memory allocation sizes.
>
> On 32-bit platforms, struct alignment padding could cause the total
> allocation size calculation to exceed 2^32, making safe integer arithmetic
> necessary.

I wonder if "X could cause Y" above skips a bit too many steps.  I
was expecting more along the lines of ...

    We will need to allocate N instances of A and M instances of B, N
    and M are capped to X and Y respectively by this code

        ... code snippet ...

    and size of an instance of A is 8 and size of B could be either W or
    Z.  When size of B is W, then the total allocation would be ...

And that analysis applies only on the first allocation.  I didn't
even look at the packed side of the allocation size, expecting that
you would know how to analyze after seeing my example on the other
allocation.

> Note that hsize + 1 inside st_add3() is safe from overflow
> because hsize is capped at 2^26 early in the function.

It is misleading to say hsize+1 is inside st_add3(), though.


> diff --git a/diff-delta.c b/diff-delta.c
> index 7cbedeb507..efebce3aca 100644
> --- a/diff-delta.c
> +++ b/diff-delta.c
> @@ -162,8 +162,8 @@ struct delta_index * create_delta_index(const void *buf, size_t bufsize)
>  	hmask = hsize - 1;
>  
>  	/* allocate lookup index */
> -	memsize = sizeof(*hash) * hsize +
> -		  sizeof(*entry) * entries;
> +	memsize = st_add(st_mult(sizeof(*hash), hsize),
> +			 st_mult(sizeof(*entry), entries));
>  	mem = malloc(memsize);
>  	if (!mem)
>  		return NULL;
> @@ -258,9 +258,9 @@ struct delta_index * create_delta_index(const void *buf, size_t bufsize)
>  	 * Now create the packed index in array form
>  	 * rather than linked lists.
>  	 */
> -	memsize = sizeof(*index)
> -		+ sizeof(*packed_hash) * (hsize+1)
> -		+ sizeof(*packed_entry) * entries;
> +	memsize = st_add3(sizeof(*index),
> +			  st_mult(sizeof(*packed_hash), hsize + 1),
> +			  st_mult(sizeof(*packed_entry), entries));
>  	mem = malloc(memsize);
>  	if (!mem) {
>  		free(hash);
>
> base-commit: 47fdf2208c5b94c8cc01c106b8f7c85efb91c926

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v3] diff-delta: use safe integer arithmetic
  2026-10-24 16:15   ` Junio C Hamano
@ 2026-10-24 17:26     ` Srujith Poojary
  2026-10-25 18:10       ` Junio C Hamano
  0 siblings, 1 reply; 19+ messages in thread
From: Srujith Poojary @ 2026-10-24 17:26 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: Srujith A Poojary via GitGitGadget, git, Phillip Wood,
	Usman Akinyemi

On Sat, Oct 24, 2026 at 9:45 PM Junio C Hamano <gitster@pobox.com> wrote:
>
> "Srujith A Poojary via GitGitGadget" <gitgitgadget@gmail.com>
> writes:
>
> > From: Srujith A Poojary <poojarysrujith@gmail.com>
> >
> > Replace manual multiplication and addition in create_delta_index()
> > with safe integer helpers (st_mult, st_add, st_add3) to prevent potential
> > overflows when computing memory allocation sizes.
> >
> > On 32-bit platforms, struct alignment padding could cause the total
> > allocation size calculation to exceed 2^32, making safe integer arithmetic
> > necessary.
>
> I wonder if "X could cause Y" above skips a bit too many steps.  I
> was expecting more along the lines of ...
>
>     We will need to allocate N instances of A and M instances of B, N
>     and M are capped to X and Y respectively by this code
>
>         ... code snippet ...
>
>     and size of an instance of A is 8 and size of B could be either W or
>     Z.  When size of B is W, then the total allocation would be ...
>
> And that analysis applies only on the first allocation.  I didn't
> even look at the packed side of the allocation size, expecting that
> you would know how to analyze after seeing my example on the other
> allocation.
>
> > Note that hsize + 1 inside st_add3() is safe from overflow
> > because hsize is capped at 2^26 early in the function.
>
> It is misleading to say hsize+1 is inside st_add3(), though.
>
>
> > diff --git a/diff-delta.c b/diff-delta.c
> > index 7cbedeb507..efebce3aca 100644
> > --- a/diff-delta.c
> > +++ b/diff-delta.c
> > @@ -162,8 +162,8 @@ struct delta_index * create_delta_index(const void *buf, size_t bufsize)
> >       hmask = hsize - 1;
> >
> >       /* allocate lookup index */
> > -     memsize = sizeof(*hash) * hsize +
> > -               sizeof(*entry) * entries;
> > +     memsize = st_add(st_mult(sizeof(*hash), hsize),
> > +                      st_mult(sizeof(*entry), entries));
> >       mem = malloc(memsize);
> >       if (!mem)
> >               return NULL;
> > @@ -258,9 +258,9 @@ struct delta_index * create_delta_index(const void *buf, size_t bufsize)
> >        * Now create the packed index in array form
> >        * rather than linked lists.
> >        */
> > -     memsize = sizeof(*index)
> > -             + sizeof(*packed_hash) * (hsize+1)
> > -             + sizeof(*packed_entry) * entries;
> > +     memsize = st_add3(sizeof(*index),
> > +                       st_mult(sizeof(*packed_hash), hsize + 1),
> > +                       st_mult(sizeof(*packed_entry), entries));
> >       mem = malloc(memsize);
> >       if (!mem) {
> >               free(hash);
> >
> > base-commit: 47fdf2208c5b94c8cc01c106b8f7c85efb91c926

Hi Junio,

Thank you for the detailed correction.

I have expanded the commit message to include the step-by-step
breakdown for both the unpacked and packed index allocations,
detailing the caps on hsize (2^26) and entries (2^28) alongside struct
padding on 32-bit systems. I also corrected the phrasing regarding
(hsize + 1) being passed as an argument to st_add3().

I have updated the patch series accordingly.

Best regards,
Srujith

^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH v4] diff-delta: use safe integer arithmetic
  2026-10-23  3:56 [PATCH] [Outreachy PATCH] diff-delta: use safe integer arithmetic Srujith A Poojary via GitGitGadget
                   ` (2 preceding siblings ...)
  2026-10-24  3:48 ` [PATCH v3] " Srujith A Poojary via GitGitGadget
@ 2026-10-24 18:00 ` Srujith A Poojary via GitGitGadget
  2026-10-25 19:20 ` [PATCH v5] " Srujith A Poojary via GitGitGadget
  4 siblings, 0 replies; 19+ messages in thread
From: Srujith A Poojary via GitGitGadget @ 2026-10-24 18:00 UTC (permalink / raw)
  To: git; +Cc: Phillip Wood, Srujith A Poojary, Srujith A Poojary

From: Srujith A Poojary <poojarysrujith@gmail.com>

Replace manual multiplication and addition in create_delta_index()
with safe integer helpers (st_mult, st_add, st_add3) to prevent potential
overflows when computing memory allocation sizes.

For the unpacked index, we allocate hsize instances of hash pointers and
entries instances of struct index_entry:
  - hsize is capped at 2^26.
  - entries is capped at 2^28.
On 32-bit platforms with 4-byte padding for struct unpacked_index_entry,
the calculation size (sizeof(*hash) * hsize + sizeof(*entry) * entries) can
exceed 2^32, making safe integer arithmetic necessary.

Similarly, for the packed index, we compute allocation size across
struct index, packed_hash, and entries. Using safe helpers prevents
wrap-around across both allocations.

Note that passing (hsize + 1) as an argument to st_add3() is safe from
overflow because hsize is capped at 2^26 early in the function.

Signed-off-by: Srujith A Poojary <poojarysrujith@gmail.com>
---
    [Outreachy PATCH] diff-delta: use safe integer arithmetic

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2276%2Fpoojarysrujith%2Fc-refactor-target-name-v4
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2276/poojarysrujith/c-refactor-target-name-v4
Pull-Request: https://github.com/gitgitgadget/git/pull/2276

Range-diff vs v3:

 1:  d288bfe9e3 ! 1:  0d5a729cde diff-delta: use safe integer arithmetic
     @@ Commit message
          with safe integer helpers (st_mult, st_add, st_add3) to prevent potential
          overflows when computing memory allocation sizes.
      
     -    On 32-bit platforms, struct alignment padding could cause the total
     -    allocation size calculation to exceed 2^32, making safe integer arithmetic
     -    necessary. Note that hsize + 1 inside st_add3() is safe from overflow
     -    because hsize is capped at 2^26 early in the function.
     +    For the unpacked index, we allocate hsize instances of hash pointers and
     +    entries instances of struct index_entry:
     +      - hsize is capped at 2^26.
     +      - entries is capped at 2^28.
     +    On 32-bit platforms with 4-byte padding for struct unpacked_index_entry,
     +    the calculation size (sizeof(*hash) * hsize + sizeof(*entry) * entries) can
     +    exceed 2^32, making safe integer arithmetic necessary.
     +
     +    Similarly, for the packed index, we compute allocation size across
     +    struct index, packed_hash, and entries. Using safe helpers prevents
     +    wrap-around across both allocations.
     +
     +    Note that passing (hsize + 1) as an argument to st_add3() is safe from
     +    overflow because hsize is capped at 2^26 early in the function.
      
          Signed-off-by: Srujith A Poojary <poojarysrujith@gmail.com>
      


 diff-delta.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/diff-delta.c b/diff-delta.c
index 7cbedeb507..efebce3aca 100644
--- a/diff-delta.c
+++ b/diff-delta.c
@@ -162,8 +162,8 @@ struct delta_index * create_delta_index(const void *buf, size_t bufsize)
 	hmask = hsize - 1;
 
 	/* allocate lookup index */
-	memsize = sizeof(*hash) * hsize +
-		  sizeof(*entry) * entries;
+	memsize = st_add(st_mult(sizeof(*hash), hsize),
+			 st_mult(sizeof(*entry), entries));
 	mem = malloc(memsize);
 	if (!mem)
 		return NULL;
@@ -258,9 +258,9 @@ struct delta_index * create_delta_index(const void *buf, size_t bufsize)
 	 * Now create the packed index in array form
 	 * rather than linked lists.
 	 */
-	memsize = sizeof(*index)
-		+ sizeof(*packed_hash) * (hsize+1)
-		+ sizeof(*packed_entry) * entries;
+	memsize = st_add3(sizeof(*index),
+			  st_mult(sizeof(*packed_hash), hsize + 1),
+			  st_mult(sizeof(*packed_entry), entries));
 	mem = malloc(memsize);
 	if (!mem) {
 		free(hash);

base-commit: 47fdf2208c5b94c8cc01c106b8f7c85efb91c926
-- 
gitgitgadget

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [PATCH v3] diff-delta: use safe integer arithmetic
  2026-10-24 17:26     ` Srujith Poojary
@ 2026-10-25 18:10       ` Junio C Hamano
  2026-10-25 19:21         ` Srujith Poojary
  0 siblings, 1 reply; 19+ messages in thread
From: Junio C Hamano @ 2026-10-25 18:10 UTC (permalink / raw)
  To: Srujith Poojary
  Cc: Srujith A Poojary via GitGitGadget, git, Phillip Wood,
	Usman Akinyemi

Srujith Poojary <poojarysrujith@gmail.com> writes:

> Thank you for the detailed correction.
>
> I have expanded the commit message to include the step-by-step
> breakdown for both the unpacked and packed index allocations,
> detailing the caps on hsize (2^26) and entries (2^28) alongside struct
> padding on 32-bit systems. I also corrected the phrasing regarding
> (hsize + 1) being passed as an argument to st_add3().

It seems that the text of v4 did not "detail" anything like that;
you just parroted the conclusion, the final numbers I gave you,
without giving any hint for the readers to validate the math.  The
readers who are interested in validating are forced to figure out
how many bytes your calculation assumes each struct type involved
consume---and if they find that your conclusion is wrong, they have
no clue where in your computation things went wrong.


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH v5] diff-delta: use safe integer arithmetic
  2026-10-23  3:56 [PATCH] [Outreachy PATCH] diff-delta: use safe integer arithmetic Srujith A Poojary via GitGitGadget
                   ` (3 preceding siblings ...)
  2026-10-24 18:00 ` [PATCH v4] " Srujith A Poojary via GitGitGadget
@ 2026-10-25 19:20 ` Srujith A Poojary via GitGitGadget
  2026-10-26 17:37   ` Junio C Hamano
  4 siblings, 1 reply; 19+ messages in thread
From: Srujith A Poojary via GitGitGadget @ 2026-10-25 19:20 UTC (permalink / raw)
  To: git; +Cc: Phillip Wood, Srujith A Poojary, Srujith A Poojary

From: Srujith A Poojary <poojarysrujith@gmail.com>

In create_delta_index(), buffer sizes for allocating the delta index
are calculated using arithmetic operations on entries and hsize:

  memsize = sizeof(*hash) * hsize + sizeof(*entry) * entries

To prevent potential size_t wrap-around when computing allocation sizes
on 32-bit systems, replace manual arithmetic with overflow-checked
helpers (st_mult, st_add, st_add3).

For the unpacked index allocation:
- sizeof(struct unpacked_index_entry) is 12 bytes on 32-bit systems,
  which may be padded to 16 bytes depending on compiler alignment rules.
- sizeof(struct index_entry *) is 4 bytes.
- entries is capped by (0xffffffu / RABIN_WINDOW) where RABIN_WINDOW is 16,
  limiting entries to 1,048,575.
- hsize is the smallest power of 2 greater than or equal to entries,
  capped at 1,048,576.

While entries is bounded in current code, using st_mult() and st_add()
guarantees that any unexpected growth in struct sizes or bounds changes
will safely die() on size_t overflow instead of wrapping around.

For the packed index allocation:
- Passing (hsize + 1) as an argument to st_add3() is safe from overflow
  because hsize is capped at 1,048,576 early in the function.

Signed-off-by: Srujith A Poojary <poojarysrujith@gmail.com>
---
    [Outreachy PATCH] diff-delta: use safe integer arithmetic

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2276%2Fpoojarysrujith%2Fc-refactor-target-name-v5
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2276/poojarysrujith/c-refactor-target-name-v5
Pull-Request: https://github.com/gitgitgadget/git/pull/2276

Range-diff vs v4:

 1:  0d5a729cde ! 1:  23fcfd3227 diff-delta: use safe integer arithmetic
     @@ Metadata
       ## Commit message ##
          diff-delta: use safe integer arithmetic
      
     -    Replace manual multiplication and addition in create_delta_index()
     -    with safe integer helpers (st_mult, st_add, st_add3) to prevent potential
     -    overflows when computing memory allocation sizes.
     -
     -    For the unpacked index, we allocate hsize instances of hash pointers and
     -    entries instances of struct index_entry:
     -      - hsize is capped at 2^26.
     -      - entries is capped at 2^28.
     -    On 32-bit platforms with 4-byte padding for struct unpacked_index_entry,
     -    the calculation size (sizeof(*hash) * hsize + sizeof(*entry) * entries) can
     -    exceed 2^32, making safe integer arithmetic necessary.
     -
     -    Similarly, for the packed index, we compute allocation size across
     -    struct index, packed_hash, and entries. Using safe helpers prevents
     -    wrap-around across both allocations.
     -
     -    Note that passing (hsize + 1) as an argument to st_add3() is safe from
     -    overflow because hsize is capped at 2^26 early in the function.
     +    In create_delta_index(), buffer sizes for allocating the delta index
     +    are calculated using arithmetic operations on entries and hsize:
     +
     +      memsize = sizeof(*hash) * hsize + sizeof(*entry) * entries
     +
     +    To prevent potential size_t wrap-around when computing allocation sizes
     +    on 32-bit systems, replace manual arithmetic with overflow-checked
     +    helpers (st_mult, st_add, st_add3).
     +
     +    For the unpacked index allocation:
     +    - sizeof(struct unpacked_index_entry) is 12 bytes on 32-bit systems,
     +      which may be padded to 16 bytes depending on compiler alignment rules.
     +    - sizeof(struct index_entry *) is 4 bytes.
     +    - entries is capped by (0xffffffu / RABIN_WINDOW) where RABIN_WINDOW is 16,
     +      limiting entries to 1,048,575.
     +    - hsize is the smallest power of 2 greater than or equal to entries,
     +      capped at 1,048,576.
     +
     +    While entries is bounded in current code, using st_mult() and st_add()
     +    guarantees that any unexpected growth in struct sizes or bounds changes
     +    will safely die() on size_t overflow instead of wrapping around.
     +
     +    For the packed index allocation:
     +    - Passing (hsize + 1) as an argument to st_add3() is safe from overflow
     +      because hsize is capped at 1,048,576 early in the function.
      
          Signed-off-by: Srujith A Poojary <poojarysrujith@gmail.com>
      


 diff-delta.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/diff-delta.c b/diff-delta.c
index 7cbedeb507..efebce3aca 100644
--- a/diff-delta.c
+++ b/diff-delta.c
@@ -162,8 +162,8 @@ struct delta_index * create_delta_index(const void *buf, size_t bufsize)
 	hmask = hsize - 1;
 
 	/* allocate lookup index */
-	memsize = sizeof(*hash) * hsize +
-		  sizeof(*entry) * entries;
+	memsize = st_add(st_mult(sizeof(*hash), hsize),
+			 st_mult(sizeof(*entry), entries));
 	mem = malloc(memsize);
 	if (!mem)
 		return NULL;
@@ -258,9 +258,9 @@ struct delta_index * create_delta_index(const void *buf, size_t bufsize)
 	 * Now create the packed index in array form
 	 * rather than linked lists.
 	 */
-	memsize = sizeof(*index)
-		+ sizeof(*packed_hash) * (hsize+1)
-		+ sizeof(*packed_entry) * entries;
+	memsize = st_add3(sizeof(*index),
+			  st_mult(sizeof(*packed_hash), hsize + 1),
+			  st_mult(sizeof(*packed_entry), entries));
 	mem = malloc(memsize);
 	if (!mem) {
 		free(hash);

base-commit: 47fdf2208c5b94c8cc01c106b8f7c85efb91c926
-- 
gitgitgadget

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [PATCH v3] diff-delta: use safe integer arithmetic
  2026-10-25 18:10       ` Junio C Hamano
@ 2026-10-25 19:21         ` Srujith Poojary
  0 siblings, 0 replies; 19+ messages in thread
From: Srujith Poojary @ 2026-10-25 19:21 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: Srujith A Poojary via GitGitGadget, git, Phillip Wood,
	Usman Akinyemi

On Sun, Oct 25, 2026 at 11:40 PM Junio C Hamano <gitster@pobox.com> wrote:
>
> Srujith Poojary <poojarysrujith@gmail.com> writes:
>
> > Thank you for the detailed correction.
> >
> > I have expanded the commit message to include the step-by-step
> > breakdown for both the unpacked and packed index allocations,
> > detailing the caps on hsize (2^26) and entries (2^28) alongside struct
> > padding on 32-bit systems. I also corrected the phrasing regarding
> > (hsize + 1) being passed as an argument to st_add3().
>
> It seems that the text of v4 did not "detail" anything like that;
> you just parroted the conclusion, the final numbers I gave you,
> without giving any hint for the readers to validate the math.  The
> readers who are interested in validating are forced to figure out
> how many bytes your calculation assumes each struct type involved
> consume---and if they find that your conclusion is wrong, they have
> no clue where in your computation things went wrong.
>
Hi Junio,

Thank you for pointing that out. You are completely right—I should
have explicitly detailed the struct sizes and exact code bounds
instead of quoting summary numbers.

I have updated the commit message in v5 to explicitly state:
- The byte sizes of each struct on 32-bit platforms (12/16 bytes for
unpacked_index_entry, 4 bytes for hash pointers).
- The exact origin of the bounds from code: entries capped by
(0xffffffu / RABIN_WINDOW = 1,048,575) and hsize capped at 1,048,576.
- Why st_mult/st_add/st_add3 are used to guard against size_t wrap-around.

Best regards,
Srujith

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v5] diff-delta: use safe integer arithmetic
  2026-10-25 19:20 ` [PATCH v5] " Srujith A Poojary via GitGitGadget
@ 2026-10-26 17:37   ` Junio C Hamano
  2026-10-26 18:47     ` Srujith Poojary
  0 siblings, 1 reply; 19+ messages in thread
From: Junio C Hamano @ 2026-10-26 17:37 UTC (permalink / raw)
  To: Srujith A Poojary via GitGitGadget; +Cc: git, Phillip Wood, Srujith A Poojary

"Srujith A Poojary via GitGitGadget" <gitgitgadget@gmail.com>
writes:

> From: Srujith A Poojary <poojarysrujith@gmail.com>
>
> In create_delta_index(), buffer sizes for allocating the delta index
> are calculated using arithmetic operations on entries and hsize:
>
>   memsize = sizeof(*hash) * hsize + sizeof(*entry) * entries
>
> To prevent potential size_t wrap-around when computing allocation sizes
> on 32-bit systems, replace manual arithmetic with overflow-checked
> helpers (st_mult, st_add, st_add3).
>
> For the unpacked index allocation:
> - sizeof(struct unpacked_index_entry) is 12 bytes on 32-bit systems,
>   which may be padded to 16 bytes depending on compiler alignment rules.
> - sizeof(struct index_entry *) is 4 bytes.
> - entries is capped by (0xffffffu / RABIN_WINDOW) where RABIN_WINDOW is 16,
>   limiting entries to 1,048,575.
> - hsize is the smallest power of 2 greater than or equal to entries,
>   capped at 1,048,576.
>
> While entries is bounded in current code, using st_mult() and st_add()
> guarantees that any unexpected growth in struct sizes or bounds changes
> will safely die() on size_t overflow instead of wrapping around.

Much more useful for future developers to learn what led to the
conclusion.

> For the packed index allocation:
> - Passing (hsize + 1) as an argument to st_add3() is safe from overflow
>   because hsize is capped at 1,048,576 early in the function.

hsize+1 is *not* an argument to st_add3(), though.  It is given to
st_mult().

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v5] diff-delta: use safe integer arithmetic
  2026-10-26 17:37   ` Junio C Hamano
@ 2026-10-26 18:47     ` Srujith Poojary
  0 siblings, 0 replies; 19+ messages in thread
From: Srujith Poojary @ 2026-10-26 18:47 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Srujith A Poojary via GitGitGadget, git, Phillip Wood

On Mon, Oct 26, 2026 at 11:07 PM Junio C Hamano <gitster@pobox.com> wrote:
>
> "Srujith A Poojary via GitGitGadget" <gitgitgadget@gmail.com>
> writes:
>
> > From: Srujith A Poojary <poojarysrujith@gmail.com>
> >
> > In create_delta_index(), buffer sizes for allocating the delta index
> > are calculated using arithmetic operations on entries and hsize:
> >
> >   memsize = sizeof(*hash) * hsize + sizeof(*entry) * entries
> >
> > To prevent potential size_t wrap-around when computing allocation sizes
> > on 32-bit systems, replace manual arithmetic with overflow-checked
> > helpers (st_mult, st_add, st_add3).
> >
> > For the unpacked index allocation:
> > - sizeof(struct unpacked_index_entry) is 12 bytes on 32-bit systems,
> >   which may be padded to 16 bytes depending on compiler alignment rules.
> > - sizeof(struct index_entry *) is 4 bytes.
> > - entries is capped by (0xffffffu / RABIN_WINDOW) where RABIN_WINDOW is 16,
> >   limiting entries to 1,048,575.
> > - hsize is the smallest power of 2 greater than or equal to entries,
> >   capped at 1,048,576.
> >
> > While entries is bounded in current code, using st_mult() and st_add()
> > guarantees that any unexpected growth in struct sizes or bounds changes
> > will safely die() on size_t overflow instead of wrapping around.
>
> Much more useful for future developers to learn what led to the
> conclusion.
>
> > For the packed index allocation:
> > - Passing (hsize + 1) as an argument to st_add3() is safe from overflow
> >   because hsize is capped at 1,048,576 early in the function.
>
> hsize+1 is *not* an argument to st_add3(), though.  It is given to
> st_mult().


Hi Junio,

Thank you! Noted on (hsize + 1) being given to st_mult() inside
st_add3(). Glad the expanded breakdown is helpful for future
reference.

Best regards,
Srujith

^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2026-10-26 18:49 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-23  3:56 [PATCH] [Outreachy PATCH] diff-delta: use safe integer arithmetic Srujith A Poojary via GitGitGadget
2026-10-23  5:04 ` Junio C Hamano
2026-10-23  5:29   ` Srujith Poojary
2026-10-23 15:30     ` Junio C Hamano
2026-10-23 16:56       ` Srujith Poojary
2026-10-23 18:45         ` Junio C Hamano
2026-10-23  5:56 ` [PATCH v2] " Srujith A Poojary via GitGitGadget
2026-10-23 15:15   ` Phillip Wood
2026-10-23 18:49     ` Junio C Hamano
2026-10-24  3:44       ` Srujith Poojary
2026-10-24  3:48 ` [PATCH v3] " Srujith A Poojary via GitGitGadget
2026-10-24 16:15   ` Junio C Hamano
2026-10-24 17:26     ` Srujith Poojary
2026-10-25 18:10       ` Junio C Hamano
2026-10-25 19:21         ` Srujith Poojary
2026-10-24 18:00 ` [PATCH v4] " Srujith A Poojary via GitGitGadget
2026-10-25 19:20 ` [PATCH v5] " Srujith A Poojary via GitGitGadget
2026-10-26 17:37   ` Junio C Hamano
2026-10-26 18:47     ` Srujith Poojary

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox