On 06/10/2025 00:03, Matthew Vernon wrote:
> Hi,
>
> Thanks for the detailed bug report.
>
> On 21/08/2025 21:36, Chris Packham wrote:
>
>> But according to strerror(3) there are two possible implementations 
>> of strerror_r().
>>
>>         int strerror_r(int errnum, char *buf, size_t buflen);
>>                     /* XSI-compliant */
>>
>>         char *strerror_r(int errnum, char *buf, size_t buflen);
>>                     /* GNU-specific */
>>
>>         strerror_r():
>>             The XSI-compliant version is provided if:
>>             (_POSIX_C_SOURCE >= 200112L) && ! _GNU_SOURCE
>>             Otherwise, the GNU-specific version is provided.
>>
>> GCC-14 now has _POSIX_C_SOURCE set to something higher than 200112L 
>> so we
>> appear to be getting the XSI compliant version of strerror_r() so 
>> simply adding
>> a cast is insufficient (and may lead to a null deference by the 
>> caller of
>> stringErrorReport()). This probably needs to be written as
>>
>> static char err_message[128];
>> strerror_r(errno, err_message,128);
>> return err_message;
>>
>> Or something should define _GNU_SOURCE to get the old behaviour.
>
> I think you're right that the fix to 1074933 was incorrect, but I 
> wonder whether we should behave differently based on the feature test 
> macros that are set (i.e. that efence should be able to cope with 
> either version of strerror_r)? so something like
>
> #if (_POSIX_C_SOURCE >= 200112L) && ! _GNU_SOURCE/* expect int return 
> */#else
> /* expect char * return */#endif?
>
I do wonder if using strerror_r() is making things harder than it needs 
to be. It seems to be making stringErrorReport() non re-entrant anyway 
so why not just use strerror() and avoid the conflicting definitions of 
strerror_r() completely.

Reply via email to