From 640e586251380ee8768c01118db56d2a42557693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 6 Jul 2022 23:45:39 +0200 Subject: [PATCH 1/3] gbacktrace: Handle case of strerror_r returning an int value As it's the case in FreeBSD and Mac OS X. --- glib/gbacktrace.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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) From edd718ba48b6e6e6ce7f34290c39ad74bbf743bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 6 Jul 2022 23:54:14 +0200 Subject: [PATCH 2/3] gstrfuncs: Handle the case strerror_r returns an error In the case strerror_r returns an error (both in the char* variant and in the int variant) we should not try to proceed converting the message and adding to the errors maps, as that's likely causing errors. So, let's just return a null string in case this happens --- glib/gstrfuncs.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/glib/gstrfuncs.c b/glib/gstrfuncs.c index 21ec0b578..7522cfa6e 100644 --- a/glib/gstrfuncs.c +++ b/glib/gstrfuncs.c @@ -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); From d21d213d008db77b970471ee7e0c7ecc0c040477 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 7 Jul 2022 00:25:25 +0200 Subject: [PATCH 3/3] gstrfuncs: Update docs for g_strerror with a string closer to reality --- glib/gstrfuncs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/glib/gstrfuncs.c b/glib/gstrfuncs.c index 7522cfa6e..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)