diff options
-rw-r--r-- | lib/utils_cmd.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/lib/utils_cmd.c b/lib/utils_cmd.c index 9e214bd4..7eb9a3a0 100644 --- a/lib/utils_cmd.c +++ b/lib/utils_cmd.c | |||
@@ -79,12 +79,14 @@ static pid_t *_cmd_pids = NULL; | |||
79 | * If that fails and the macro isn't defined, we fall back to an educated | 79 | * If that fails and the macro isn't defined, we fall back to an educated |
80 | * guess. There's no guarantee that our guess is adequate and the program | 80 | * guess. There's no guarantee that our guess is adequate and the program |
81 | * will die with SIGSEGV if it isn't and the upper boundary is breached. */ | 81 | * will die with SIGSEGV if it isn't and the upper boundary is breached. */ |
82 | #define DEFAULT_MAXFD 256 /* fallback value if no max open files value is set */ | ||
83 | #define MAXFD_LIMIT 8192 /* upper limit of open files */ | ||
82 | #ifdef _SC_OPEN_MAX | 84 | #ifdef _SC_OPEN_MAX |
83 | static long maxfd = 0; | 85 | static long maxfd = 0; |
84 | #elif defined(OPEN_MAX) | 86 | #elif defined(OPEN_MAX) |
85 | # define maxfd OPEN_MAX | 87 | # define maxfd OPEN_MAX |
86 | #else /* sysconf macro unavailable, so guess (may be wildly inaccurate) */ | 88 | #else /* sysconf macro unavailable, so guess (may be wildly inaccurate) */ |
87 | # define maxfd 256 | 89 | # define maxfd DEFAULT_MAXFD |
88 | #endif | 90 | #endif |
89 | 91 | ||
90 | 92 | ||
@@ -112,10 +114,18 @@ cmd_init (void) | |||
112 | if (!maxfd && (maxfd = sysconf (_SC_OPEN_MAX)) < 0) { | 114 | if (!maxfd && (maxfd = sysconf (_SC_OPEN_MAX)) < 0) { |
113 | /* possibly log or emit a warning here, since there's no | 115 | /* possibly log or emit a warning here, since there's no |
114 | * guarantee that our guess at maxfd will be adequate */ | 116 | * guarantee that our guess at maxfd will be adequate */ |
115 | maxfd = 256; | 117 | maxfd = DEFAULT_MAXFD; |
116 | } | 118 | } |
117 | #endif | 119 | #endif |
118 | 120 | ||
121 | /* if maxfd is unnaturally high, we force it to a lower value | ||
122 | * ( e.g. on SunOS, when ulimit is set to unlimited: 2147483647 this would cause | ||
123 | * a segfault when following calloc is called ... ) */ | ||
124 | |||
125 | if ( maxfd > MAXFD_LIMIT ) { | ||
126 | maxfd = MAXFD_LIMIT; | ||
127 | } | ||
128 | |||
119 | if (!_cmd_pids) | 129 | if (!_cmd_pids) |
120 | _cmd_pids = calloc (maxfd, sizeof (pid_t)); | 130 | _cmd_pids = calloc (maxfd, sizeof (pid_t)); |
121 | } | 131 | } |