diff options
Diffstat (limited to 'lib')
| -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 | } |
