From 4f4a57303ab48b75895ae88be98c6ce630e64d92 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Fri, 20 May 2011 04:01:43 +0200 Subject: [PATCH] strerror_r: Work around strerror_r() change in Cygwin 1.7.8. * lib/strerror_r.c (strerror_r) [CYGWIN]: Recognize when the system's strerror_r() returned without filling the buffer. Reported by Eric Blake. --- ChangeLog | 7 +++++++ lib/strerror_r.c | 33 +++++++++++++++++++++++++++++---- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 49568395d..e9da0044d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2011-05-19 Bruno Haible + + strerror_r: Work around strerror_r() change in Cygwin 1.7.8. + * lib/strerror_r.c (strerror_r) [CYGWIN]: Recognize when the system's + strerror_r() returned without filling the buffer. + Reported by Eric Blake. + 2011-05-19 Eric Blake strerror_r: guarantee unchanged errno diff --git a/lib/strerror_r.c b/lib/strerror_r.c index 4aac34542..30dcd44e7 100644 --- a/lib/strerror_r.c +++ b/lib/strerror_r.c @@ -459,10 +459,35 @@ strerror_r (int errnum, char *buf, size_t buflen) ret = strerror_r (errnum, buf, buflen); } # elif defined __CYGWIN__ - /* Cygwin 1.7.8 only provides the glibc interface, is thread-safe, and - always succeeds (although it may truncate). */ - strerror_r (errnum, buf, buflen); - ret = 0; + /* Cygwin <= 1.7.7 only provides the glibc interface, is thread-safe, and + always succeeds (although it may truncate). In Cygwin >= 1.7.8, for + valid errnum values, instead of truncating, it leaves the buffer + untouched. */ + { + char stackbuf[256]; + + if (buflen < sizeof (stackbuf)) + { + size_t len; + + stackbuf[0] = '\0'; /* in case strerror_r does nothing */ + strerror_r (errnum, stackbuf, sizeof (stackbuf)); + len = strlen (stackbuf); + if (len < buflen) + { + memcpy (buf, stackbuf, len + 1); + ret = 0; + } + else + ret = ERANGE; + } + else + { + buf[0] = '\0'; /* in case strerror_r does nothing */ + strerror_r (errnum, buf, buflen); + ret = 0; + } + } # else ret = strerror_r (errnum, buf, buflen); # endif -- 2.11.0