tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[PATCH 6/6] fdopen() opens successfully more descriptiors than STREAM_MAX



fdopen() should return EMFILE if amount of file descriptors exceeds STREAM_MAX
or FOPEN_MAX limit.
---
 include/stdio.h | 2 +-
 lib/libc/stdio/fdopen.c | 5 ++++-
 sys/sys/sysctl.h | 2 +-
 3 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/include/stdio.h b/include/stdio.h
index 05ba32b..a8a15a9 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -179,7 +179,7 @@ __END_DECLS
 * stdio can provide without attempting to allocate further resources
 * (which could fail). Do not use this for anything.
 */
- /* must be == _POSIX_STREAM_MAX <limits.h> */
+/*#define STREAM_MAX 8*/ /* must be == _POSIX_STREAM_MAX 
<limits.h> */
 #define FOPEN_MAX 20 /* must be <= OPEN_MAX 
<sys/syslimits.h> */
 #define FILENAME_MAX 1024 /* must be <= PATH_MAX 
<sys/syslimits.h> */
 
diff --git a/lib/libc/stdio/fdopen.c b/lib/libc/stdio/fdopen.c
index e2f7a03..e8b3400 100644
--- a/lib/libc/stdio/fdopen.c
+++ b/lib/libc/stdio/fdopen.c
@@ -74,8 +74,11 @@ fdopen(fd, mode)
 * USHRT_MAX, then the fd will get sign-extended into an
 * invalid file descriptor. Handle this case by failing the
 * open. (We treat the short as unsigned, and special-case -1).
+ *
+ * In other side we can't exceed the whether FOPEN_MAX or STREAM_MAX
+ * limits as SUSv3 requires. For both we're using FOPEN_MAX here.
 */
- if (fd >= USHRT_MAX) {
+ if ((fd >= FOPEN_MAX) || (fd >= USHRT_MAX)) {
 errno = EMFILE;
 return NULL;
 }
diff --git a/sys/sys/sysctl.h b/sys/sys/sysctl.h
index 8cc2cdc..3375fbe 100644
--- a/sys/sys/sysctl.h
+++ b/sys/sys/sysctl.h
@@ -851,7 +851,7 @@ struct kinfo_file {
 #define USER_POSIX2_LOCALEDEF 16 /* int: POSIX2_LOCALEDEF */
 #define USER_POSIX2_SW_DEV 17 /* int: POSIX2_SW_DEV */
 #define USER_POSIX2_UPE 18 /* int: POSIX2_UPE */
-#define USER_STREAM_MAX 19 /* int: POSIX2_STREAM_MAX */
+#define USER_STREAM_MAX 19 /* int: _POSIX_STREAM_MAX */
 #define USER_TZNAME_MAX 20 /* int: _POSIX_TZNAME_MAX */
 #define USER_ATEXIT_MAX 21 /* int: {ATEXIT_MAX} */
 #define USER_MAXID 22 /* number of valid user ids */
-- 
1.5.2.5


Home | Main Index | Thread Index | Old Index

AltStyle によって変換されたページ (->オリジナル) /