[PATCH] Add "%d" support to _dl_debug_vdprintf
Adhemerval Zanella
adhemerval.zanella@linaro.org
Tue Jun 9 16:19:19 GMT 2020
On 09/06/2020 11:46, H.J. Lu wrote:
> On Tue, Jun 9, 2020 at 7:39 AM Adhemerval Zanella
> <adhemerval.zanella@linaro.org> wrote:
>>
>>
>>
>> On 09/06/2020 11:18, Adhemerval Zanella wrote:
>>>
>>>
>>> On 05/06/2020 12:03, H.J. Lu via Libc-alpha wrote:
>>>> "%d" will be used to print out signed value.
>>>
>>> LGTM with some smalls nits below.
>>>
>>>> ---
>>>> elf/dl-misc.c | 31 +++++++++++++++++++++++++++++--
>>>> 1 file changed, 29 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/elf/dl-misc.c b/elf/dl-misc.c
>>>> index ab70481fda..c82c8ae6fa 100644
>>>> --- a/elf/dl-misc.c
>>>> +++ b/elf/dl-misc.c
>>>> @@ -167,6 +167,7 @@ _dl_debug_vdprintf (int fd, int tag_p, const char *fmt, va_list arg)
>>>> switch (*fmt)
>>>> {
>>>> /* Integer formatting. */
>>>> + case 'd':
>>>> case 'u':
>>>> case 'x':
>>>> {
>>>
>>> Ok.
>>>
>>>> @@ -179,11 +180,34 @@ _dl_debug_vdprintf (int fd, int tag_p, const char *fmt, va_list arg)
>>>> #else
>>>> unsigned long int num = va_arg (arg, unsigned int);
>>>> #endif
>>>> + bool negative = false;
>>>> + if (*fmt == 'd')
>>>> + {
>>>> +#if LONG_MAX != INT_MAX
>>>> + if (long_mod)
>>>> + {
>>>> + if ((long) num < 0)
>>>
>>> Full type specify on cast.
>>>
>>>> + negative = true;
>>>> + }
>>>> + else
>>>> + {
>>>> + if ((int) num < 0)> + {
>>>> + num = (unsigned int) num;
>>>> + negative = true;
>>>> + }
>>>> + }
>>>> +#else
>>>> + if ((int) num < 0)
>>>> + negative = true;
>>>> +#endif
>>>> + }
>>>> +
>>>> /* We use alloca() to allocate the buffer with the most
>>>> pessimistic guess for the size. Using alloca() allows
>>>> having more than one integer formatting in a call. */
>>>> - char *buf = (char *) alloca (3 * sizeof (unsigned long int));
>>>> - char *endp = &buf[3 * sizeof (unsigned long int)];
>>>> + char *buf = (char *) alloca (1 + 3 * sizeof (unsigned long int));
>>>> + char *endp = &buf[1 + 3 * sizeof (unsigned long int)];
>>>
>>> I think we can remove alloca here and use INT_STRLEN_BOUND (since the
>>> string is not '\0' bounded due the writev usage). Something like:
>>
>> Sigh, you can't actually remove the alloca here.
>
> Why not? It seems to work:
>
Because the iov uses the allocated buffer on the _dl_writev and it will
an invalid pointer if we allocate on the stack without alloca.
More information about the Libc-alpha
mailing list