1
0
mirror of https://https.git.savannah.gnu.org/git/gnulib.git synced 2026-09-01 02:34:55 +00:00

strerror_r-posix: Fix for Hurd.

* lib/strerror_r.c (strerror_r): Interpret return value of
__xpg_strerror_r correctly. Remove assumption about how strerror_r
behaves.
This commit is contained in:
Bruno Haible
2022-09-02 23:45:21 +02:00
parent 1fc1837555
commit d2c8e80ae6
2 changed files with 16 additions and 6 deletions
+7
View File
@@ -1,3 +1,10 @@
2022-09-02 Bruno Haible <bruno@clisp.org>
strerror_r-posix: Fix for Hurd.
* lib/strerror_r.c (strerror_r): Interpret return value of
__xpg_strerror_r correctly. Remove assumption about how strerror_r
behaves.
2022-09-02 Bruno Haible <bruno@clisp.org>
ptsname tests, ptsname_r tests: Fix test failures on Hurd.
+9 -6
View File
@@ -166,16 +166,19 @@ strerror_r (int errnum, char *buf, size_t buflen)
# if HAVE___XPG_STRERROR_R
ret = __xpg_strerror_r (errnum, buf, buflen);
if (ret < 0)
ret = errno;
/* ret is 0 upon success, or EINVAL or ERANGE upon failure. */
# endif
if (!*buf)
{
/* glibc 2.13 would not touch buf on err, so we have to fall
back to GNU strerror_r which always returns a thread-safe
untruncated string to (partially) copy into our buf. */
char *errstring = strerror_r (errnum, buf, buflen);
/* glibc 2.13 ... 2.34 (at least) don't touch buf upon failure.
Therefore we have to fall back to strerror_r which, for valid
errnum, returns a thread-safe untruncated string. For invalid
errnum, though, it returns a truncated string, which does not
allow us to determine whether to return ERANGE or 0. Thus we
need to pass a sufficiently large buffer. */
char stackbuf[80];
char *errstring = strerror_r (errnum, stackbuf, sizeof stackbuf);
ret = errstring ? safe_copy (buf, buflen, errstring) : errno;
}
}