UB status of snprintf on invalid ptr+size combination?
Siddhesh Poyarekar
siddhesh@gotplt.org
Mon Mar 20 12:05:32 GMT 2023
On 2023-03-19 19:07, Vincent Lefevre wrote:
> On 2023-03-19 10:45:59 -0400, manfred via Libc-alpha wrote:
>> All of that said, back to the OP case I would not pass INT_MAX to snprintf.
>> If I have a situation wherein I know that the buffer is large enough, but I
>> don't know its exact size, I'd use sprintf and be done with it. (I'm sure
>> that the actual code is more elaborate than this, but still)
>
> In simple code, probably. But in actual code, it may be more natural
> to use snprintf. Something like that:
>
> snprintf(buf, checked ? SIZE_MAX : n, "%s", s);
>
> The function may not know the buffer size if `checked` is true,
> so that it uses a known bound. Thanks to common code factorized,
> this is more readable than
>
> if (checked)
> sprintf (buf, "%s", s);
> else
> snprintf(buf, n, "%s", s);
>
> in particular in the cases where the format string is complex.
If your application requires such patterns then it really needs an
additional layer of abstraction or maybe a rethink on the pattern
itself. This is not something the C runtime should try to solve.
I think on the glibc front it makes sense from a security perspective to
interpret this through POSIX than the C standard. Even if the C
standard is clarified to be contrary to POSIX and explicitly state that
n is not the size of the buffer (which would be a terrible mistake IMO),
I'd lean towards violating the C standard and conforming to POSIX instead.
Sid
More information about the Libc-alpha
mailing list