diff --git a/glib/gbacktrace.c b/glib/gbacktrace.c index ae4bdec0c..6f4604e1f 100644 --- a/glib/gbacktrace.c +++ b/glib/gbacktrace.c @@ -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) diff --git a/glib/gstrfuncs.c b/glib/gstrfuncs.c index 21ec0b578..0386e8e45 100644 --- a/glib/gstrfuncs.c +++ b/glib/gstrfuncs.c @@ -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 ()". + * is unknown, it returns a string like "Unknown error: ". */ 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);