Cleaning up FILE in stdio..

Garrett Wollman wollman at hergotha.csail.mit.edu
Wed Feb 27 05:26:27 UTC 2008


In article <200802262355.16519.jhb at freebsd.org>,
John Baldwin <jhb at freebsd.org> writes:
>On Tuesday 26 February 2008 05:51:07 pm Garrett Wollman wrote:

>+	/*
>+	 * File descriptors are a full int, but _file is only a short.
>+	 * If we get a valid file descriptor that is greater than
>+	 * SHRT_MAX, then the fd will get sign-extended into an
>+	 * invalid file descriptor.  Handle this case by failing the
>+	 * open.
>+	 */
>+	if (fd > SHRT_MAX) {
>+		errno = EINVAL;
>+		return (NULL);
>+	}
>+

Please, please, please, whatever you do, don't add Yet Another
Overloaded Meaning for [EINVAL].  Use [EMFILE] instead, which is
defined to have the precise meaning desired here.  For extra credit,
fix the various places {STREAM_MAX} is defined to take this limit into
account.  I think the following may be all that is required (beware
xterm cut-and-paste screwage):

Index: lib/libc/gen/sysconf.c
===================================================================
RCS file: /home/ncvs/src/lib/libc/gen/sysconf.c,v
retrieving revision 1.20
diff -u -r1.20 sysconf.c
--- lib/libc/gen/sysconf.c	17 Nov 2002 08:54:29 -0000	1.20
+++ lib/libc/gen/sysconf.c	27 Feb 2008 05:23:24 -0000
@@ -105,7 +105,6 @@
		mib[1] = KERN_NGROUPS;
		break;
	case _SC_OPEN_MAX:
-	case _SC_STREAM_MAX:	/* assume fds run out before memory does */
		if (getrlimit(RLIMIT_NOFILE, &rl) != 0)
			return (-1);
		if (rl.rlim_cur == RLIM_INFINITY)
@@ -115,6 +114,25 @@
			return (-1);
		}
		return ((long)rl.rlim_cur);
+	case _SC_STREAM_MAX:
+		if (getrlimit(RLIMIT_NOFILE, &rl) != 0)
+			return (-1);
+		if (rl.rlim_cur == RLIM_INFINITY)
+			return (-1);
+		if (rl.rlim_cur > LONG_MAX) {
+			errno = EOVERFLOW;
+			return (-1);
+		}
+		/*
+		 * struct __sFILE currently has a limitation that
+		 * file descriptors must fit in a signed short.
+		 * This doesn't precisely capture the letter of POSIX
+		 * but approximates the spirit.
+		 */
+		if (rl.rlim_cur > SHRT_MAX)
+			return (SHRT_MAX);
+
+		return ((long)rl.rlim_cur);
	case _SC_JOB_CONTROL:
		return (_POSIX_JOB_CONTROL);
	case _SC_SAVED_IDS:


-GAWollman



More information about the freebsd-arch mailing list