diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/utils_base.c | 15 | ||||
-rw-r--r-- | lib/utils_cmd.c | 14 |
2 files changed, 22 insertions, 7 deletions
diff --git a/lib/utils_base.c b/lib/utils_base.c index addf26bd..3822bcf1 100644 --- a/lib/utils_base.c +++ b/lib/utils_base.c | |||
@@ -446,6 +446,7 @@ void np_enable_state(char *keyname, int expected_data_version) { | |||
446 | char *temp_filename = NULL; | 446 | char *temp_filename = NULL; |
447 | char *temp_keyname = NULL; | 447 | char *temp_keyname = NULL; |
448 | char *p=NULL; | 448 | char *p=NULL; |
449 | int ret; | ||
449 | 450 | ||
450 | if(this_monitoring_plugin==NULL) | 451 | if(this_monitoring_plugin==NULL) |
451 | die(STATE_UNKNOWN, _("This requires np_init to be called")); | 452 | die(STATE_UNKNOWN, _("This requires np_init to be called")); |
@@ -476,9 +477,13 @@ void np_enable_state(char *keyname, int expected_data_version) { | |||
476 | this_state->state_data=NULL; | 477 | this_state->state_data=NULL; |
477 | 478 | ||
478 | /* Calculate filename */ | 479 | /* Calculate filename */ |
479 | asprintf(&temp_filename, "%s/%lu/%s/%s", | 480 | ret = asprintf(&temp_filename, "%s/%lu/%s/%s", |
480 | _np_state_calculate_location_prefix(), (unsigned long)geteuid(), | 481 | _np_state_calculate_location_prefix(), (unsigned long)geteuid(), |
481 | this_monitoring_plugin->plugin_name, this_state->name); | 482 | this_monitoring_plugin->plugin_name, this_state->name); |
483 | if (ret < 0) | ||
484 | die(STATE_UNKNOWN, _("Cannot allocate memory: %s"), | ||
485 | strerror(errno)); | ||
486 | |||
482 | this_state->_filename=temp_filename; | 487 | this_state->_filename=temp_filename; |
483 | 488 | ||
484 | this_monitoring_plugin->state = this_state; | 489 | this_monitoring_plugin->state = this_state; |
@@ -614,8 +619,8 @@ void np_state_write_string(time_t data_time, char *data_string) { | |||
614 | 619 | ||
615 | /* If file doesn't currently exist, create directories */ | 620 | /* If file doesn't currently exist, create directories */ |
616 | if(access(this_monitoring_plugin->state->_filename,F_OK)!=0) { | 621 | if(access(this_monitoring_plugin->state->_filename,F_OK)!=0) { |
617 | asprintf(&directories, "%s", this_monitoring_plugin->state->_filename); | 622 | result = asprintf(&directories, "%s", this_monitoring_plugin->state->_filename); |
618 | if(directories==NULL) | 623 | if(result < 0) |
619 | die(STATE_UNKNOWN, _("Cannot allocate memory: %s"), | 624 | die(STATE_UNKNOWN, _("Cannot allocate memory: %s"), |
620 | strerror(errno)); | 625 | strerror(errno)); |
621 | 626 | ||
@@ -633,8 +638,8 @@ void np_state_write_string(time_t data_time, char *data_string) { | |||
633 | np_free(directories); | 638 | np_free(directories); |
634 | } | 639 | } |
635 | 640 | ||
636 | asprintf(&temp_file,"%s.XXXXXX",this_monitoring_plugin->state->_filename); | 641 | result = asprintf(&temp_file,"%s.XXXXXX",this_monitoring_plugin->state->_filename); |
637 | if(temp_file==NULL) | 642 | if(result < 0) |
638 | die(STATE_UNKNOWN, _("Cannot allocate memory: %s"), | 643 | die(STATE_UNKNOWN, _("Cannot allocate memory: %s"), |
639 | strerror(errno)); | 644 | strerror(errno)); |
640 | 645 | ||
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 | } |