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

Re: [PATCH v2 2/4] string-list: replace negative index encoding with "exact_match" parameter

From
Jeff King <peff@peff.net>
Date
Oct 9, 2025, 05:52 UTC
Message-ID
<20251009055237.GC1614343@coredump.intra.peff.net>
In-Reply-To
<xmqq5xd6irmu.fsf@gitster.g>
On Thu, Sep 25, 2025 at 06:33:13AM -0700, Junio C Hamano wrote:
Show 14 quoted lines
> Jeff King <peff@peff.net> writes:
> 
> > Yes, but it's much harder to wrap a size_t, especially if the code is
> > allocating as it goes (e.g., a loop expanding an array). Because if
> > expanding your allocation from "n" to "n+k" items will overflow, then
> > that implies the current allocation is within "k" items of filling up
> > the entire memory space.
> 
> We'd be protecting ourselves by noticing that n+k wraps around with
> st_add() and friends, and relying on malloc() and realloc() to
> notice and signal an error.  Use of size_t to count the number of
> things that are getting allocated is not making these any easier to
> do compared to the case you were counting in "int", no?  Either way
> we'd need to be careful.

Yes and no. I agree it is probably good to check for overflow as a general principle, even if using size_t. But it is also easy to miss such spots, and I do think using size_t (or something similarly large) can provide some backup safety.

If you are getting values "foo" and "bar" from the user and computing a length like "size_t len = foo * bar", then the size of the type will not help you, and you need to do checked arithmetic. But I think those cases are relatively easy to spot. The much more insidious ones are those that append to a data structure one item at a time. With a type that is close to the practical size of memory, you will fail to grow your data structure before you hit the overflow. With a much smaller type like int (on an LP64 platform), it is much easier for malicious input to cause funky wrapping[1].

If your position is "it would not matter if we were properly checking for overflow", then I agree. I just think it's hard to catch all of the spots. But maybe I am being overly pessimistic. _Most_ of that should go through ALLOC_GROW() or similar, so the checks could be centralized-ish[2].

-Peff
[1] We have had (and I'd wager probably still have) bugs where an
    attacker can wrap around to negative int. We get saved from a
    vulnerability here because the negative value is eventually cast to
    a gigantic size_t to allocate, which fails. In that sense I think
    "unsigned int" is the _most_ dangerous type to use.
[2] I think there are some practical implementation questions here, too.
    If we use st_add() etc in ALLOC_GROW(), then we may get caught by
    accidental type promotions, where those functions say "sure, it is
    OK to increase this len", but then return a size_t which is
    truncated when we try to stuff it back in an "int". So to make
    ALLOC_GROW() type independent, we probably need to do some more
    macro hackery with our checked arithmetic to make sure we are
    operating with the same size type that the caller is using. Not
    impossible, but something we'd have to be careful to get right.
Previous: Junio C HamanoNext: Collin Funk
Message 25 of 43 in “enhance string-list API to fix sign compare warnings”
  1. 0/4 enhance string-list API to fix sign compare warningsshejialuo, Sep 7, 2025
  2. 1/4 string-list: allow passing NULL for `get_entry_index`shejialuo, Sep 7, 2025
  3. Patrick SteinhardtSep 9, 2025
  4. 2/4 string-list: replace negative index encoding with "exact_match" parametershejialuo, Sep 7, 2025
  5. Patrick SteinhardtSep 9, 2025
  6. shejialuoSep 15, 2025
  7. 3/4 string-list: change "string_list_find_insert_index" return type to "size_t"shejialuo, Sep 7, 2025
  8. Patrick SteinhardtSep 9, 2025
  9. Junio C HamanoSep 9, 2025
  10. Patrick SteinhardtSep 10, 2025
  11. 4/4 refs: enable sign compare warnings checkshejialuo, Sep 7, 2025
  12. Patrick SteinhardtSep 9, 2025
  13. shejialuoSep 7, 2025
  14. 0/4 enhance string-list API to fix sign compare warningsshejialuo, Sep 17, 2025
  15. 1/4 string-list: use bool instead of int for "exact_match"shejialuo, Sep 17, 2025
  16. 2/4 string-list: replace negative index encoding with "exact_match" parametershejialuo, Sep 17, 2025
  17. Patrick SteinhardtSep 23, 2025
  18. shejialuoOct 5, 2025
  19. Karthik NayakSep 23, 2025
  20. Junio C HamanoSep 23, 2025
  21. Jeff KingSep 24, 2025
  22. Junio C HamanoSep 24, 2025
  23. Jeff KingSep 25, 2025
  24. Junio C HamanoSep 25, 2025
  25. Jeff KingOct 9, 2025
  26. Collin FunkOct 8, 2025
  27. Jeff KingOct 9, 2025
  28. shejialuoOct 5, 2025
  29. shejialuoOct 5, 2025
  30. 3/4 string-list: change "string_list_find_insert_index" return type to "size_t"shejialuo, Sep 17, 2025
  31. Karthik NayakSep 23, 2025
  32. shejialuoOct 5, 2025
  33. 4/4 refs: enable sign compare warnings checkshejialuo, Sep 17, 2025
  34. 0/4 enhance string-list API to fix sign compare warningsshejialuo, Oct 6, 2025
  35. 1/4 string-list: use bool instead of int for "exact_match"shejialuo, Oct 6, 2025
  36. 2/4 string-list: replace negative index encoding with "exact_match" parametershejialuo, Oct 6, 2025
  37. 3/4 string-list: change "string_list_find_insert_index" return type to "size_t"shejialuo, Oct 6, 2025
  38. Jeff KingOct 9, 2025
  39. 4/4 refs: enable sign compare warnings checkshejialuo, Oct 6, 2025
  40. Junio C HamanoOct 6, 2025
  41. Collin FunkOct 8, 2025
  42. Junio C HamanoOct 8, 2025
  43. Karthik NayakOct 8, 2025

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.