Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F142242970
D54355.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
D54355.diff
View Options
diff --git a/include/stdio.h b/include/stdio.h
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -126,7 +126,7 @@
int _r; /* (*) read space left for getc() */
int _w; /* (*) write space left for putc() */
short _flags; /* (*) flags, below; this FILE is free if 0 */
- short _fileno; /* (*) fileno, if Unix descriptor, else -1 */
+ short _fileno_short; /* (*) fileno, if Unix descriptor and <= SHRT_MAX, else -1 [legacy] */
struct __sbuf _bf; /* (*) the buffer (at least 1 byte, if !NULL) */
int _lbfsize; /* (*) 0 or -_bf._size, for inline putc */
@@ -159,6 +159,7 @@
int _orientation; /* orientation for fwide() */
__mbstate_t _mbstate; /* multibyte conversion state */
int _flags2; /* additional flags */
+ int _fileno; /* (*) fileno, if Unix descriptor, else -1 */
};
#ifndef _STDFILE_DECLARED
#define _STDFILE_DECLARED
diff --git a/lib/libc/stdio/fclose.c b/lib/libc/stdio/fclose.c
--- a/lib/libc/stdio/fclose.c
+++ b/lib/libc/stdio/fclose.c
@@ -61,6 +61,7 @@
if (HASLB(fp))
FREELB(fp);
fp->_fileno = -1;
+ fp->_fileno_short = -1;
fp->_r = fp->_w = 0; /* Mess up if reaccessed. */
/*
diff --git a/lib/libc/stdio/fdopen.c b/lib/libc/stdio/fdopen.c
--- a/lib/libc/stdio/fdopen.c
+++ b/lib/libc/stdio/fdopen.c
@@ -48,18 +48,6 @@
FILE *fp;
int flags, oflags, fdflags, rc, tmp;
- /*
- * File descriptors are a full int, but _fileno 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 = EMFILE;
- return (NULL);
- }
-
if ((flags = __sflags(mode, &oflags)) == 0)
return (NULL);
@@ -102,6 +90,7 @@
else if (oflags & O_APPEND)
fp->_flags |= __SAPP;
fp->_fileno = fd;
+ fp->_fileno_short = (unsigned)fd > SHRT_MAX ? -1 : fd;
fp->_cookie = fp;
fp->_read = __sread;
fp->_write = __swrite;
diff --git a/lib/libc/stdio/findfp.c b/lib/libc/stdio/findfp.c
--- a/lib/libc/stdio/findfp.c
+++ b/lib/libc/stdio/findfp.c
@@ -53,6 +53,7 @@
#define std(flags, file) { \
._flags = (flags), \
._fileno = (file), \
+ ._fileno_short = (file), \
._cookie = __sF + (file), \
._close = __sclose, \
._read = __sread, \
@@ -146,6 +147,7 @@
fp->_bf._size = 0;
fp->_lbfsize = 0; /* not line buffered */
fp->_fileno = -1; /* no file */
+ fp->_fileno_short = -1; /* no file */
/* fp->_cookie = <any>; */ /* caller sets cookie, _read/_write etc */
fp->_ub._base = NULL; /* no ungetc buffer */
fp->_ub._size = 0;
diff --git a/lib/libc/stdio/fopen.c b/lib/libc/stdio/fopen.c
--- a/lib/libc/stdio/fopen.c
+++ b/lib/libc/stdio/fopen.c
@@ -59,20 +59,8 @@
fp->_flags = 0; /* release */
return (NULL);
}
- /*
- * File descriptors are a full int, but _fileno 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 (f > SHRT_MAX) {
- fp->_flags = 0; /* release */
- _close(f);
- errno = EMFILE;
- return (NULL);
- }
fp->_fileno = f;
+ fp->_fileno_short = (unsigned)f > SHRT_MAX ? -1 : f;
fp->_flags = flags;
fp->_cookie = fp;
fp->_read = __sread;
diff --git a/lib/libc/stdio/freopen.c b/lib/libc/stdio/freopen.c
--- a/lib/libc/stdio/freopen.c
+++ b/lib/libc/stdio/freopen.c
@@ -212,22 +212,9 @@
(void)_close(fp->_fileno);
}
- /*
- * File descriptors are a full int, but _fileno 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 (f > SHRT_MAX) {
- fp->_flags = 0; /* set it free */
- errno = EMFILE;
- fp = NULL;
- goto end;
- }
-
fp->_flags = flags;
fp->_fileno = f;
+ fp->_fileno_short = (unsigned)f > SHRT_MAX ? -1 : f;
fp->_cookie = fp;
fp->_read = __sread;
fp->_write = __swrite;
diff --git a/lib/libc/stdio/funopen.c b/lib/libc/stdio/funopen.c
--- a/lib/libc/stdio/funopen.c
+++ b/lib/libc/stdio/funopen.c
@@ -63,6 +63,7 @@
return (NULL);
fp->_flags = flags;
fp->_fileno = -1;
+ fp->_fileno_short = -1;
fp->_cookie = (void *)cookie;
fp->_read = readfn;
fp->_write = writefn;
diff --git a/lib/libc/stdio/local.h b/lib/libc/stdio/local.h
--- a/lib/libc/stdio/local.h
+++ b/lib/libc/stdio/local.h
@@ -129,6 +129,7 @@
*/
#define FAKE_FILE { \
._fileno = -1, \
+ ._fileno_short = -1, \
._fl_mutex = PTHREAD_MUTEX_INITIALIZER, \
}
diff --git a/lib/libc/stdio/vdprintf.c b/lib/libc/stdio/vdprintf.c
--- a/lib/libc/stdio/vdprintf.c
+++ b/lib/libc/stdio/vdprintf.c
@@ -49,15 +49,11 @@
int serrno = errno;
int ret;
- if (fd > SHRT_MAX) {
- errno = EMFILE;
- return (EOF);
- }
-
f._p = buf;
f._w = sizeof(buf);
f._flags = __SWR;
f._fileno = fd;
+ f._fileno_short = (unsigned)fd > SHRT_MAX ? -1 : fd;
f._cookie = &f;
f._write = __swrite;
f._bf._base = buf;
diff --git a/lib/libc/stdio/vfprintf.c b/lib/libc/stdio/vfprintf.c
--- a/lib/libc/stdio/vfprintf.c
+++ b/lib/libc/stdio/vfprintf.c
@@ -183,6 +183,7 @@
/* copy the important variables */
fake._flags = fp->_flags & ~__SNBF;
fake._fileno = fp->_fileno;
+ fake._fileno_short = fp->_fileno_short;
fake._cookie = fp->_cookie;
fake._write = fp->_write;
fake._orientation = fp->_orientation;
diff --git a/lib/libc/stdio/vfwprintf.c b/lib/libc/stdio/vfwprintf.c
--- a/lib/libc/stdio/vfwprintf.c
+++ b/lib/libc/stdio/vfwprintf.c
@@ -219,6 +219,7 @@
/* copy the important variables */
fake._flags = fp->_flags & ~__SNBF;
fake._fileno = fp->_fileno;
+ fake._fileno_short = fp->_fileno_short;
fake._cookie = fp->_cookie;
fake._write = fp->_write;
fake._orientation = fp->_orientation;
diff --git a/lib/libc/stdio/xprintf.c b/lib/libc/stdio/xprintf.c
--- a/lib/libc/stdio/xprintf.c
+++ b/lib/libc/stdio/xprintf.c
@@ -582,6 +582,7 @@
/* copy the important variables */
fake._flags = fp->_flags & ~__SNBF;
fake._fileno = fp->_fileno;
+ fake._fileno_short = fp->_fileno_short;
fake._cookie = fp->_cookie;
fake._write = fp->_write;
fake._orientation = fp->_orientation;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Jan 18, 5:48 PM (17 h, 51 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27713965
Default Alt Text
D54355.diff (6 KB)
Attached To
Mode
D54355: stdio: rename short _fileno to _fileno_short for legacy abi compatibility, add new int _fileno in struct __sFILE
Attached
Detach File
Event Timeline
Log In to Comment