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

Re: [PATCH 3/3] git_parse_signed(): avoid integer overflow

From
PWPhillip Wood <phillip.wood123@gmail.com>
Date
Oct 25, 2022, 10:00 UTC
Message-ID
<190de302-0898-50a1-1a9d-ab1ccc5c6bb8@dunelm.org.uk>
In-Reply-To
<c24c3ac9-0de6-62f6-607f-2d8f69ca9fa8@web.de>
On 23/10/2022 06:57, René Scharfe wrote:
Show 46 quoted lines
> Am 22.10.22 um 18:51 schrieb Junio C Hamano:
>> René Scharfe <l.s.r@web.de> writes:
>>
>>>>> +		if (max < 0)
>>>>> +			BUG("max must be a positive integer");
>>>>
>>>> In parse_signed(), would we expect to accept end-user input that is
>>>> a negative integer?  We must.  Otherwise we would not be calling a
>>>> "signed" parser.  Now, are there cases where the valid value range
>>>> is bounded by a negative integer at the top?  No current callers may
>>>> pass such a value, but is it reasonable to add such a new constraints
>>>> to an existing API function?
>>>
>>> Hmm, if minimum and maximum are not symmetric, then we need to supply
>>> both, don't we?
>>
>> Ah, thanks for injecting doze of sanity---I totally missed that the
>> bound was about the absolute value, so we can say "this is signed,
>> and the allowed values are (-3, -2, -1, 0, 1, 2, 3).  If so, then the
>> "reject negative max" in the posted patch is not a problem as I said
>> above.  I somehow thought that giving -1 as "max" would allow callers
>> to say "non-negative numbers are not allowed".  But that is not what
>> is going on.
> 
> Right, currently the value of `max` is used to check the absolute value,
> i.e. it imposes a limit in both the positive and negative direction.
> 
>> Allowing callers to specify both lower and uppoer bounds so that
>> they can say "the allowed values are (-1, 0, 1, 2, 3)", while it
>> might make it more useful, is a separate new feature development and
>> outside the scope of "let's tighten the parsing of end user input"
>> Phillip has here.
> 
> Allowing arbitrary limits in both directions might be a new feature, but
> it's required if we want to support the full range of values.  E.g. on
> my system INT_MAX is 2147483647 and INT_MIN is -2147483647-1.  Currently
> git_parse_int() rejects INT_MIN as out of range.
> 
> In my eyes the assumption that a single limit can be used to check both
> directions of the signed number line is flawed and caused the undefined
> behavior.  Dropping it avoids tricky calculations that try to infer the
> lower limit somehow and opens the full range of values to us.
> 
> That said, I'm not sure how useful the values INT_MIN, INT64_MIN and
> SSIZE_MIN (which unlike SSIZE_MAX is not defined by POSIX [*]) actually
> are. But doing the checks properly requires separate min and max values.

I'm happy to go either way, while I agree passing separate limits to allow INT_MIN is technically correct I'm not sure anyone has complained that the current code is too restrictive.

Best Wishes
Phillip
Show 5 quoted lines
> René
> 
> 
> [*] Perhaps git_parse_ssize_t() should reject values less than -1; only
> that single negative number is needed to represent errors or unlimited.
Previous: René ScharfeNext: René Scharfe
Message 20 of 27 in “a few config integer parsing fixes”
  1. 0/3 a few config integer parsing fixesPhillip Wood via GitGitGadget, Oct 21, 2022
  2. 1/3 git_parse_unsigned: reject negative valuesPhillip Wood via GitGitGadget, Oct 21, 2022
  3. Junio C HamanoOct 21, 2022
  4. Jeff KingOct 21, 2022
  5. Junio C HamanoOct 22, 2022
  6. 2/3 config: require at least one digit when parsing numbersPhillip Wood via GitGitGadget, Oct 21, 2022
  7. Junio C HamanoOct 21, 2022
  8. Phillip WoodOct 25, 2022
  9. Junio C HamanoOct 25, 2022
  10. Jeff KingOct 21, 2022
  11. Junio C HamanoOct 22, 2022
  12. Jeff KingOct 22, 2022
  13. Junio C HamanoOct 22, 2022
  14. Phillip WoodOct 25, 2022
  15. 3/3 git_parse_signed(): avoid integer overflowPhillip Wood via GitGitGadget, Oct 21, 2022
  16. Junio C HamanoOct 21, 2022
  17. René ScharfeOct 22, 2022
  18. Junio C HamanoOct 22, 2022
  19. René ScharfeOct 23, 2022
  20. Phillip WoodOct 25, 2022
  21. René ScharfeOct 26, 2022
  22. 0/3 a few config integer parsing fixesPhillip Wood via GitGitGadget, Nov 9, 2022
  23. 1/3 git_parse_unsigned: reject negative valuesPhillip Wood via GitGitGadget, Nov 9, 2022
  24. Ævar Arnfjörð BjarmasonNov 9, 2022
  25. 2/3 config: require at least one digit when parsing numbersPhillip Wood via GitGitGadget, Nov 9, 2022
  26. 3/3 git_parse_signed(): avoid integer overflowPhillip Wood via GitGitGadget, Nov 9, 2022
  27. Taylor BlauNov 10, 2022

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.