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;
 }

Reply via email to