Module Name: src
Committed By: kre
Date: Wed Mar 25 16:15:41 UTC 2020
Modified Files:
src/lib/libc/string: strerror_r.c
Log Message:
Arrange that strerror(-1) prints "Unknown error: -1" and not the
unsigned equivalent of -1.
While here, guarantee, even when !NLS, that nothing here (not even
snprintf deciding to complain about EILSEQ or something) can ever
alter errno (ie: always save and restore it, not only in the NLS case).
The functions here must never alter errno, whatever happens.
To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/lib/libc/string/strerror_r.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libc/string/strerror_r.c
diff -u src/lib/libc/string/strerror_r.c:1.4 src/lib/libc/string/strerror_r.c:1.5
--- src/lib/libc/string/strerror_r.c:1.4 Tue Jan 10 20:25:48 2017
+++ src/lib/libc/string/strerror_r.c Wed Mar 25 16:15:41 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: strerror_r.c,v 1.4 2017/01/10 20:25:48 christos Exp $ */
+/* $NetBSD: strerror_r.c,v 1.5 2020/03/25 16:15:41 kre Exp $ */
/*
* Copyright (c) 1988 Regents of the University of California.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: strerror_r.c,v 1.4 2017/01/10 20:25:48 christos Exp $");
+__RCSID("$NetBSD: strerror_r.c,v 1.5 2020/03/25 16:15:41 kre Exp $");
#include "namespace.h"
#include <assert.h>
@@ -53,12 +53,12 @@ __weak_alias(strerror_r, _strerror_r)
int
_strerror_lr(int num, char *buf, size_t buflen, locale_t loc)
{
-#define UPREFIX "Unknown error: %u"
+#define UPREFIX "Unknown error: %d"
unsigned int errnum = num;
int retval = 0;
size_t slen;
-#ifdef NLS
int saved_errno = errno;
+#ifdef NLS
nl_catd catd;
catd = catopen_l("libc", NL_CAT_LOCALE, loc);
#endif
@@ -66,7 +66,7 @@ _strerror_lr(int num, char *buf, size_t
if (errnum < (unsigned int) sys_nerr) {
#ifdef NLS
- slen = strlcpy(buf, catgets(catd, 1, (int)errnum,
+ slen = strlcpy(buf, catgets(catd, 1, num,
sys_errlist[errnum]), buflen);
#else
slen = strlcpy(buf, sys_errlist[errnum], buflen);
@@ -74,9 +74,9 @@ _strerror_lr(int num, char *buf, size_t
} else {
#ifdef NLS
slen = snprintf_l(buf, buflen, loc,
- catgets(catd, 1, 0xffff, UPREFIX), errnum);
+ catgets(catd, 1, 0xffff, UPREFIX), num);
#else
- slen = snprintf(buf, buflen, UPREFIX, errnum);
+ slen = snprintf(buf, buflen, UPREFIX, num);
#endif
retval = EINVAL;
}
@@ -86,8 +86,8 @@ _strerror_lr(int num, char *buf, size_t
#ifdef NLS
catclose(catd);
- errno = saved_errno;
#endif
+ errno = saved_errno;
return retval;
}