git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v7] diff-delta: use safe integer arithmetic

From
SPSrujith Poojary <poojarysrujith@gmail.com>
Date
Oct 27, 2026, 16:57 UTC
Message-ID
<CABh_KWju4DP17T6aj4nEJJQJjP0fn+_V8ja0WaE6VcDCkj9URA@mail.gmail.com>
In-Reply-To
<xmqqtsm7m7ms.fsf@gitster.g>
On Tue, Oct 27, 2026 at 9:57 PM Junio C Hamano <gitster@pobox.com> wrote:
Show 48 quoted lines
>
> "Pablo Sabater" <pabloosabaterr@gmail.com> writes:
>
> > On Tue Oct 27, 2026 at 11:00 AM WET, Srujith A Poojary via GitGitGadget wrote:
> >> From: Srujith A Poojary <poojarysrujith@gmail.com>
> >>
> > [snip]
> >>
> >> For the unpacked index allocation:
> >> - sizeof(struct unpacked_index_entry) is exactly 16 bytes on 32-bit systems
>
> "exactly 16 bytes"?  That sounds fishy.
>
> It is implementation defined, a naive expectation is it would be
> more common to make it occupy 12 bytes, and we should expect it to
> be larger like 16 bytes depending on platforms.
>
> The C standard (e.g., ISO/IEC 9899:1999) has this:
>
>     Within a structure object, the non-bit-field members and the
>     units in which bit-fields reside have addresses that increase in
>     the order in which they are declared.  A pointer to a structure
>     object, suitably converted, points to its initial member (or if
>     that member is a bit-field, then to the unit in which it
>     resides), and vice versa.  There may be unnamed padding within a
>     structure object, but not at its beginning.
>
> For a 32-bit platform, the minimum natural alignment for a 4-byte
> unsigned int, unsigned char *, and a pointer to a struct, are all 4
> bytes.  However, the standard specifies minimum requirements, not
> maximums.  A compiler is entirely free to choose a stricter
> alignment (such as 16 bytes) for performance optimization reasons,
> e.g., to align for better cache line utilization or vectorization.
>
> I think your math is correct in that the computation for allocation
> size would not overflow if we can assume the struct involved is
> always 12-byte on 32-bit systems.  That would make this patch
> unnecessary (and the patch is unnecessary on 64-bit systems with
> wider size_t to begin with).  But we cannot assume the best case.
>
> We could assume sizeof(struct unpacked_index_entry) == 12 on
> platforms where we can depend on GCC/Clang's __attribute__((packed))
> and C11's <stdalign.h>, but we are not doing that (and I am not sure
> if we want to, as these can introduce different portability issues).
>
> Thanks for pointing out the fishy description.
>
>
Hi Junio and Pablo,
Thank you both for the detailed feedback and guidance.

Junio, your explanation regarding implementation-defined struct alignment and why hardcoding exact padding sizes can be misleading across different compilers and platforms was extremely helpful. Pablo, thank you for pushing for precision on the exact bounds and math.

I have just submitted v9, which updates the commit message to
incorporate these insights:
- Shifted the focus to robust defensive programming, acknowledging
that struct layout and padding can vary across platforms while using
st_mult() and st_add() to protect against any future size variations
or wrap-arounds.
- Explicitly documented the exact bounds: entries capped by
0xfffffffeU / RABIN_WINDOW, and hsize capped at 2^26 (with a minimum
of 16).

Thank you both for taking the time to review this thoroughly and help me get it right.

Best regards, Srujith

Previous: Junio C HamanoNext: Srujith A Poojary via GitGitGadget
Message 29 of 31 in “diff-delta: use safe integer arithmetic”
  1. [Outreachy PATCH] diff-delta: use safe integer arithmeticSrujith A Poojary via GitGitGadget, Oct 23, 2026
  2. Junio C HamanoOct 23, 2026
  3. Srujith PoojaryOct 23, 2026
  4. Junio C HamanoOct 23, 2026
  5. Srujith PoojaryOct 23, 2026
  6. Junio C HamanoOct 23, 2026
  7. diff-delta: use safe integer arithmeticSrujith A Poojary via GitGitGadget, Oct 23, 2026
  8. Phillip WoodOct 23, 2026
  9. Junio C HamanoOct 23, 2026
  10. Srujith PoojaryOct 24, 2026
  11. diff-delta: use safe integer arithmeticSrujith A Poojary via GitGitGadget, Oct 24, 2026
  12. Junio C HamanoOct 24, 2026
  13. Srujith PoojaryOct 24, 2026
  14. Junio C HamanoOct 25, 2026
  15. Srujith PoojaryOct 25, 2026
  16. diff-delta: use safe integer arithmeticSrujith A Poojary via GitGitGadget, Oct 24, 2026
  17. diff-delta: use safe integer arithmeticSrujith A Poojary via GitGitGadget, Oct 25, 2026
  18. Junio C HamanoOct 26, 2026
  19. Srujith PoojaryOct 26, 2026
  20. Srujith PoojaryOct 27, 2026
  21. diff-delta: use safe integer arithmeticSrujith A Poojary via GitGitGadget, Oct 27, 2026
  22. Pablo SabaterOct 27, 2026
  23. Srujith PoojaryOct 27, 2026
  24. Pablo SabaterOct 27, 2026
  25. diff-delta: use safe integer arithmeticSrujith A Poojary via GitGitGadget, Oct 27, 2026
  26. Pablo SabaterOct 27, 2026
  27. Srujith PoojaryOct 27, 2026
  28. Junio C HamanoOct 27, 2026
  29. Srujith PoojaryOct 27, 2026
  30. diff-delta: use safe integer arithmeticSrujith A Poojary via GitGitGadget, Oct 27, 2026
  31. diff-delta: use safe integer arithmeticSrujith A Poojary via GitGitGadget, Oct 27, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.