Hi Martin,

Thanks for your speedy reply and clarifications.

But I don't understand why the second invocation of `xrealloc` can not
return zero, I apologize for any imprecise information I provided in the
previous emails.

>From my understanding, once the second the `xrealloc` is invocated, there
is a possibility that the `result` (
https://github.com/mirror/make/blob/4.2/misc.c#L247) can return zero (from
either `realloc` or `malloc`, just like the first invocation of
`xrealloc`). Later, the `OUT_OF_MEM` function will be invocated again, and
then the function `get_buffer`. In the following execution inside the
function `get_buffer`, no `xrealloc` will be called as the condition `need
> fmtbuf.size` (https://github.com/mirror/make/blob/4.2/output.c#L599) is
false (the global static value `fmtbuf.size`, defined in
https://github.com/mirror/make/blob/4.2/output.c#L593, was increased after
the previous innovation of `get_buffer`), and then the execution of
`fmtbuf.buffer[need-1] = '\0';` (
https://github.com/mirror/make/blob/4.2/output.c#L605) leads to the null
pointer dereference. Btw, I am sorry I don't see the recursive execution in
this case (the link you provided seems old and I don't see such
implementation in the version of make-4.2).

Please kindly let me know if I misunderstand something. Thank you so much
for your time again!

Best regards,
Haoxin

Martin Dorey <martin.do...@hitachivantara.com> 于2024年1月20日周六 22:43写道:

>
>    - once the second invocation of `xrealloc` ... returns zero
>
>
> But it doesn't, it just recurses, calls get_buffer again, again likely
> fails and recurses still further until the stack is blown.  Or it did until
> https://git.savannah.gnu.org/cgit/make.git/commit/?id=68be4f74fce91b76e5915449268d6b5eb687aab9
> .
>
> ------------------------------
> *From:* bug-make-bounces+martin.dorey=hds....@gnu.org
> <bug-make-bounces+martin.dorey=hds....@gnu.org> on behalf of Haoxin Tu <
> haoxi...@gmail.com>
> *Sent:* Saturday, January 20, 2024 06:17
> *To:* Paul D. Smith <invalid.nore...@gnu.org>
> *Cc:* Paul D. Smith <psm...@gnu.org>; bo...@kolpackov.net <
> bo...@kolpackov.net>; bug-make@gnu.org <bug-make@gnu.org>
> *Subject:* Re: [bug #64551] Possible null pointer dereference on the
> function get_buffer
>
> ***** EXTERNAL EMAIL *****
> Hi,
>
> Thank you so much for your time and reply.
>
> We understand that the entire point of `xrealloc` is never returning 0 to
> client users/developers who use this function. However, the issue we
> reported here happens when the `xrealloc` internally handles the returned 0
> from `realloc` or `malloc` functions.
>
> In general, the key point is that the function `OUT_OF_MEM()` (invoked
> when the `result` gets a 0 in the implementation of `xrealloc`) does not
> immediately terminate the program execution, and the function
> `OUT_OF_MEM()` will continue to allocate buffers via `xrealloc` for
> printing purposes in the following and then terminate. Specifically, the
> continuous execution of function `OUT_OF_MEM()` calls the `xrealloc` again
> through the `get_buffer` function (`OUT_OF_MEM()` is a macro definition
> that will call the function `fatal`, which finally invocates the function
> `get_buffer`). As we mentioned in the initial report, once the second
> invocation of `xrealloc` (i.e., the one called inside `OUT_OF_MEM()`)
> returns zero and calls `OUT_OF_MEM()` again, a null pointer dereference is
> occurred in `fmtbuf.buffer[need-1] = '\0';` in the function `get_buffer`.
>
> Please kindly check my explanation above and correct me if I am wrong.
> Thank you so much again and looking forward to hearing from you back again.
>
>
> Best regards,
> Haoxin
>
> Paul D. Smith <invalid.nore...@gnu.org> 于2024年1月7日周日 01:49写道:
>
>> Update of bug#64551 (group make):
>>
>>                   Status:                    None => Duplicate
>>
>>              Assigned to:                    None => psmith
>>
>>              Open/Closed:                    Open => Closed
>>
>>
>>     _______________________________________________________
>>
>> Follow-up Comment #1:
>>
>> I don't see how the "second" xrealloc() would return 0; the entire point
>> of
>> xrealloc is that it never returns 0.
>>
>> However, I can see where the behavior of the code might lead to an
>> infinite
>> loop.
>>
>> This issue was already addressed in GNU Make 4.3 via bug #13651
>> The version you're testing (4.2) was released in 2016.
>>
>> It's certainly helpful to check for errors in tools like GNU Make but
>> please
>> check either the most recent published version or, even better, the
>> current
>> Git HEAD version.
>>
>> Thanks!
>>
>>
>>     _______________________________________________________
>>
>> Reply to this item at:
>>
>>   <https://savannah.gnu.org/bugs/?64551>
>>
>> _______________________________________________
>> Message sent via Savannah
>> https://savannah.gnu.org/
>>
>>

Reply via email to