Bug: https://bugs.gentoo.org/897870 From: Brahmajit Das Date: Tue, 12 Sep 2023 17:32:42 +0000 Subject: [PATCH] Fix incompatible integer to pointer conversion on musl musl libc only supports XSI-compliant version of strerror_r. Hence we need to check if __GLIBC__ is defined or not. Also it's incorrectly assumed to use a differnt version of gethostbyname_r than that's available with glibc or musl libc. Without the extra !defined(__GLIBC__) the condition goes straight to the following section of the code ``` #elif defined(HAVE_GETHOSTBYNAME_R) hostent = gethostbyname_r(addr, hostent, tmpbuf, tmplen, &soap->errnum); #elif defined(VXWORKS) ``` Which is not the correct implementation of gethostbyname_r present. Signed-off-by: Brahmajit Das --- a/gsoap/stdsoap2.c +++ b/gsoap/stdsoap2.c @@ -23145,7 +23145,7 @@ soap_strerror(struct soap *soap) { #ifndef WIN32 # ifdef HAVE_STRERROR_R -# if !defined(_GNU_SOURCE) || (!(~_GNU_SOURCE+1) && ((!defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600))) +# if !defined(_GNU_SOURCE) || (!(~_GNU_SOURCE+1) && ((!defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600))) || !defined(__GLIBC__) err = strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* XSI-compliant */ if (err != 0) soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "unknown error"); --- a/gsoap/stdsoap2.cpp +++ b/gsoap/stdsoap2.cpp @@ -5457,7 +5457,7 @@ tcp_gethostbyname(struct soap *soap, const char *addr, struct hostent *hostent, { #if (defined(_AIX43) || defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R) struct hostent_data ht_data; -#elif (!defined(_GNU_SOURCE) || (!(~_GNU_SOURCE+1) && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(FREEBSD) || defined(__FreeBSD__)) && defined(HAVE_GETHOSTBYNAME_R) +#elif (!defined(_GNU_SOURCE) || (!(~_GNU_SOURCE+1) && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(FREEBSD) || defined(__FreeBSD__)) && defined(HAVE_GETHOSTBYNAME_R) || !defined(__GLIBC__) int r; char *tmpbuf = soap->tmpbuf; size_t tmplen = sizeof(soap->tmpbuf); @@ -5490,7 +5490,7 @@ tcp_gethostbyname(struct soap *soap, const char *addr, struct hostent *hostent, hostent = NULL; soap->errnum = h_errno; } -#elif (!defined(_GNU_SOURCE) || (!(~_GNU_SOURCE+1) && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(FREEBSD) || defined(__FreeBSD__)) && !defined(SUN_OS) && !defined(__QNX__) && !defined(QNX) && defined(HAVE_GETHOSTBYNAME_R) +#elif (!defined(_GNU_SOURCE) || (!(~_GNU_SOURCE+1) && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(FREEBSD) || defined(__FreeBSD__)) || !defined(__GLIBC__) && !defined(SUN_OS) && !defined(__QNX__) && !defined(QNX) && defined(HAVE_GETHOSTBYNAME_R) while ((r = gethostbyname_r(addr, hostent, tmpbuf, tmplen, &hostent, &soap->errnum)) < 0) { if (tmpbuf != soap->tmpbuf) @@ -23145,7 +23145,7 @@ soap_strerror(struct soap *soap) { #ifndef WIN32 # ifdef HAVE_STRERROR_R -# if !defined(_GNU_SOURCE) || (!(~_GNU_SOURCE+1) && ((!defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600))) +# if !defined(_GNU_SOURCE) || (!(~_GNU_SOURCE+1) && ((!defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600))) || !defined(__GLIBC__) err = strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* XSI-compliant */ if (err != 0) soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "unknown error");