Merge branch 'strerror_r-int-variant-support' into 'main'

gbacktrace: Handle case of strerror_r returning an int value

See merge request GNOME/glib!2800
This commit is contained in:
Philip Withnall 2022-07-07 11:14:44 +00:00
commit 1bf53c9ced
2 changed files with 22 additions and 4 deletions

View File

@ -323,8 +323,13 @@ stack_trace_sigchld (int signum)
static inline const char *
get_strerror (char *buffer, gsize n)
{
#ifdef HAVE_STRERROR_R
#if defined(STRERROR_R_CHAR_P)
return strerror_r (errno, buffer, n);
#elif defined(HAVE_STRERROR_R)
int ret = strerror_r (errno, buffer, n);
if (ret == 0 || ret == EINVAL)
return buffer;
return NULL;
#else
const char *error_str = strerror (errno);
if (!error_str)

View File

@ -1313,7 +1313,7 @@ g_ascii_strtoll (const gchar *nptr,
* ]|
*
* Returns: a UTF-8 string describing the error code. If the error code
* is unknown, it returns a string like "unknown error (<code>)".
* is unknown, it returns a string like "Unknown error: <code>".
*/
const gchar *
g_strerror (gint errnum)
@ -1336,6 +1336,9 @@ g_strerror (gint errnum)
{
gchar buf[1024];
GError *error = NULL;
#if defined(HAVE_STRERROR_R) && !defined(STRERROR_R_CHAR_P)
int ret;
#endif
#if defined(G_OS_WIN32)
strerror_s (buf, sizeof (buf), errnum);
@ -1345,13 +1348,23 @@ g_strerror (gint errnum)
# if defined(STRERROR_R_CHAR_P)
msg = strerror_r (errnum, buf, sizeof (buf));
# else
(void) strerror_r (errnum, buf, sizeof (buf));
msg = buf;
ret = strerror_r (errnum, buf, sizeof (buf));
if (ret == 0 || ret == EINVAL)
msg = buf;
# endif /* HAVE_STRERROR_R */
#else
g_strlcpy (buf, strerror (errnum), sizeof (buf));
msg = buf;
#endif
if (!msg)
{
G_UNLOCK (errors);
errno = saved_errno;
return msg;
}
if (!g_get_console_charset (NULL))
{
msg = g_locale_to_utf8 (msg, -1, NULL, NULL, &error);