Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 15 Apr 2011 19:46:25 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r220664 - in stable/8: lib/libc/gen lib/libc/string tools/regression/lib/libc/string
Message-ID:  <201104151946.p3FJkP5Q079737@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jilles
Date: Fri Apr 15 19:46:25 2011
New Revision: 220664
URL: http://svn.freebsd.org/changeset/base/220664

Log:
  MFC r220376: Allow strerror(0) and strerror_r(0, ...).
  
  Of course, strerror_r() may still fail with ERANGE.
  
  Although the POSIX specification said this could fail with EINVAL and
  doing this likely indicates invalid use of errno, most other
  implementations permitted it, various POSIX testsuites require it to
  work (matching the older sys_errlist array) and apparently some
  applications depend on it.
  
  PR:		standards/151316

Modified:
  stable/8/lib/libc/gen/errlst.c
  stable/8/lib/libc/string/strerror.3
  stable/8/lib/libc/string/strerror.c
  stable/8/tools/regression/lib/libc/string/test-strerror.c
Directory Properties:
  stable/8/lib/libc/   (props changed)
  stable/8/lib/libc/stdtime/   (props changed)
  stable/8/tools/regression/lib/libc/   (props changed)

Modified: stable/8/lib/libc/gen/errlst.c
==============================================================================
--- stable/8/lib/libc/gen/errlst.c	Fri Apr 15 18:34:27 2011	(r220663)
+++ stable/8/lib/libc/gen/errlst.c	Fri Apr 15 19:46:25 2011	(r220664)
@@ -36,7 +36,7 @@ __FBSDID("$FreeBSD$");
 #include <stdio.h>
 
 const char *const sys_errlist[] = {
-	"Undefined error: 0",			/*  0 - ENOERROR */
+	"No error: 0",				/*  0 - ENOERROR */
 	"Operation not permitted",		/*  1 - EPERM */
 	"No such file or directory",		/*  2 - ENOENT */
 	"No such process",			/*  3 - ESRCH */

Modified: stable/8/lib/libc/string/strerror.3
==============================================================================
--- stable/8/lib/libc/string/strerror.3	Fri Apr 15 18:34:27 2011	(r220663)
+++ stable/8/lib/libc/string/strerror.3	Fri Apr 15 19:46:25 2011	(r220664)
@@ -32,7 +32,7 @@
 .\"     @(#)strerror.3	8.1 (Berkeley) 6/9/93
 .\" $FreeBSD$
 .\"
-.Dd October 12, 2004
+.Dd April 5, 2011
 .Dt STRERROR 3
 .Os
 .Sh NAME
@@ -114,6 +114,9 @@ the range 0 <
 .Fa errnum
 <
 .Fa sys_nerr .
+The number 0 is also recognized, although applications that take advantage of
+this are likely to use unspecified values of
+.Va errno .
 .Pp
 If insufficient storage is provided in
 .Fa strerrbuf

Modified: stable/8/lib/libc/string/strerror.c
==============================================================================
--- stable/8/lib/libc/string/strerror.c	Fri Apr 15 18:34:27 2011	(r220663)
+++ stable/8/lib/libc/string/strerror.c	Fri Apr 15 19:46:25 2011	(r220664)
@@ -87,7 +87,7 @@ strerror_r(int errnum, char *strerrbuf, 
 	catd = catopen("libc", NL_CAT_LOCALE);
 #endif
 
-	if (errnum < 1 || errnum >= sys_nerr) {
+	if (errnum < 0 || errnum >= sys_nerr) {
 		errstr(errnum,
 #if defined(NLS)
 			catgets(catd, 1, 0xffff, UPREFIX),

Modified: stable/8/tools/regression/lib/libc/string/test-strerror.c
==============================================================================
--- stable/8/tools/regression/lib/libc/string/test-strerror.c	Fri Apr 15 18:34:27 2011	(r220663)
+++ stable/8/tools/regression/lib/libc/string/test-strerror.c	Fri Apr 15 19:46:25 2011	(r220664)
@@ -42,17 +42,12 @@ main(void)
 	char *sret;
 	int iret;
 
-	plan_tests(25);
+	plan_tests(27);
 
 	/*
 	 * strerror() failure tests.
 	 */
 	errno = 0;
-	sret = strerror(0);
-	ok1(strcmp(sret, "Unknown error: 0") == 0);
-	ok1(errno == EINVAL);
-
-	errno = 0;
 	sret = strerror(INT_MAX);
 	snprintf(buf, sizeof(buf), "Unknown error: %d", INT_MAX);
 	ok1(strcmp(sret, buf) == 0);
@@ -62,6 +57,11 @@ main(void)
 	 * strerror() success tests.
 	 */
 	errno = 0;
+	sret = strerror(0);
+	ok1(strcmp(sret, "No error: 0") == 0);
+	ok1(errno == 0);
+
+	errno = 0;
 	sret = strerror(EPERM);
 	ok1(strcmp(sret, "Operation not permitted") == 0);
 	ok1(errno == 0);
@@ -79,8 +79,8 @@ main(void)
 	 * strerror_r() failure tests.
 	 */
 	memset(buf, '*', sizeof(buf));
-	iret = strerror_r(0, buf, sizeof(buf));
-	ok1(strcmp(buf, "Unknown error: 0") == 0);
+	iret = strerror_r(-1, buf, sizeof(buf));
+	ok1(strcmp(buf, "Unknown error: -1") == 0);
 	ok1(iret == EINVAL);
 
 	memset(buf, '*', sizeof(buf));
@@ -117,6 +117,11 @@ main(void)
 	 * strerror_r() success tests.
 	 */
 	memset(buf, '*', sizeof(buf));
+	iret = strerror_r(0, buf, sizeof(buf));
+	ok1(strcmp(buf, "No error: 0") == 0);
+	ok1(iret == 0);
+
+	memset(buf, '*', sizeof(buf));
 	iret = strerror_r(EDEADLK, buf, sizeof(buf));
 	ok1(strcmp(buf, "Resource deadlock avoided") == 0);
 	ok1(iret == 0);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201104151946.p3FJkP5Q079737>