diff options
| author | John Baldwin <jhb@FreeBSD.org> | 2008-02-27 19:02:02 +0000 |
|---|---|---|
| committer | John Baldwin <jhb@FreeBSD.org> | 2008-02-27 19:02:02 +0000 |
| commit | c55d7e868aeb0e29e47c3a8ea9238e143f2a4c78 (patch) | |
| tree | 636eaa9d47e5f42f8f59cf335161c68af6b7300a /lib/libc/stdio/freopen.c | |
| parent | ae87be447c2fb719e44536229cb72d5c1b9d8d31 (diff) | |
Notes
Diffstat (limited to 'lib/libc/stdio/freopen.c')
| -rw-r--r-- | lib/libc/stdio/freopen.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/lib/libc/stdio/freopen.c b/lib/libc/stdio/freopen.c index b5bc8840d512..a5663866c296 100644 --- a/lib/libc/stdio/freopen.c +++ b/lib/libc/stdio/freopen.c @@ -203,6 +203,20 @@ finish: } } + /* + * 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 (f > SHRT_MAX) { + fp->_flags = 0; /* set it free */ + FUNLOCKFILE(fp); + errno = EMFILE; + return (NULL); + } + fp->_flags = flags; fp->_file = f; fp->_cookie = fp; |
