summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/utils_base.c15
-rw-r--r--lib/utils_cmd.c14
2 files changed, 22 insertions, 7 deletions
diff --git a/lib/utils_base.c b/lib/utils_base.c
index addf26b..3822bcf 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 9e214bd..7eb9a3a 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
83static long maxfd = 0; 85static 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}