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?

Regards,

Matthew

Reply via email to