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 * static inline const char *
get_strerror (char *buffer, gsize n) get_strerror (char *buffer, gsize n)
{ {
#ifdef HAVE_STRERROR_R #if defined(STRERROR_R_CHAR_P)
return strerror_r (errno, buffer, n); 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 #else
const char *error_str = strerror (errno); const char *error_str = strerror (errno);
if (!error_str) 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 * 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 * const gchar *
g_strerror (gint errnum) g_strerror (gint errnum)
@ -1336,6 +1336,9 @@ g_strerror (gint errnum)
{ {
gchar buf[1024]; gchar buf[1024];
GError *error = NULL; GError *error = NULL;
#if defined(HAVE_STRERROR_R) && !defined(STRERROR_R_CHAR_P)
int ret;
#endif
#if defined(G_OS_WIN32) #if defined(G_OS_WIN32)
strerror_s (buf, sizeof (buf), errnum); strerror_s (buf, sizeof (buf), errnum);
@ -1345,13 +1348,23 @@ g_strerror (gint errnum)
# if defined(STRERROR_R_CHAR_P) # if defined(STRERROR_R_CHAR_P)
msg = strerror_r (errnum, buf, sizeof (buf)); msg = strerror_r (errnum, buf, sizeof (buf));
# else # else
(void) strerror_r (errnum, buf, sizeof (buf)); ret = strerror_r (errnum, buf, sizeof (buf));
if (ret == 0 || ret == EINVAL)
msg = buf; msg = buf;
# endif /* HAVE_STRERROR_R */ # endif /* HAVE_STRERROR_R */
#else #else
g_strlcpy (buf, strerror (errnum), sizeof (buf)); g_strlcpy (buf, strerror (errnum), sizeof (buf));
msg = buf; msg = buf;
#endif #endif
if (!msg)
{
G_UNLOCK (errors);
errno = saved_errno;
return msg;
}
if (!g_get_console_charset (NULL)) if (!g_get_console_charset (NULL))
{ {
msg = g_locale_to_utf8 (msg, -1, NULL, NULL, &error); msg = g_locale_to_utf8 (msg, -1, NULL, NULL, &error);