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