summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Guyot-Sionnest <dermoth@aei.ca>2010-07-02 12:55:19 -0400
committerThomas Guyot-Sionnest <dermoth@aei.ca>2010-07-02 12:55:19 -0400
commitcf2bcf6c7afa8eb7a54e01f98a9998a7e1ac0852 (patch)
tree3739ed79238c65567ad1001a4f80856af652f660
parent6b6051606175d870bb45bbe67866c1643d4d964a (diff)
downloadmonitoring-plugins-cf2bcf6c7afa8eb7a54e01f98a9998a7e1ac0852.tar.gz
Fix cmd_run overwriting the environment
Some commands need the environment to function properly. One such example is check_ssh and check_by_ssh when a SOCKS proxy is required. This patch use setenv and extern char **environ to alter and pass the new environment to the child process Those modules have been added to Gnulib for portability.
-rw-r--r--NEWS1
-rw-r--r--lib/utils_cmd.c9
2 files changed, 6 insertions, 4 deletions
diff --git a/NEWS b/NEWS
index 5cbb9027..79ddc535 100644
--- a/NEWS
+++ b/NEWS
@@ -29,6 +29,7 @@ This file documents the major additions and syntax changes between releases.
29 Fix translations when extra-opts aren't enabled (Jan Wagner - #2832884) 29 Fix translations when extra-opts aren't enabled (Jan Wagner - #2832884)
30 Fix parsing of multi-line strings in check_snmp (broken in 1.4.14) and enhance output in such case (#2832451) 30 Fix parsing of multi-line strings in check_snmp (broken in 1.4.14) and enhance output in such case (#2832451)
31 Fix detection of pst3 64-bit compile flags with Sun CC 31 Fix detection of pst3 64-bit compile flags with Sun CC
32 Fix cmd_run overwriting the environment, which would break some commands that needed it
32 WARNINGS 33 WARNINGS
33 Updated developer documentation to say that performance labels should not have an equals sign or 34 Updated developer documentation to say that performance labels should not have an equals sign or
34 single quote in the label 35 single quote in the label
diff --git a/lib/utils_cmd.c b/lib/utils_cmd.c
index e10ab918..0c853dcc 100644
--- a/lib/utils_cmd.c
+++ b/lib/utils_cmd.c
@@ -48,6 +48,9 @@
48# include <sys/wait.h> 48# include <sys/wait.h>
49#endif 49#endif
50 50
51/* used in _cmd_open to pass the environment to commands */
52extern char **environ;
53
51/** macros **/ 54/** macros **/
52#ifndef WEXITSTATUS 55#ifndef WEXITSTATUS
53# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) 56# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
@@ -122,7 +125,6 @@ cmd_init (void)
122static int 125static int
123_cmd_open (char *const *argv, int *pfd, int *pfderr) 126_cmd_open (char *const *argv, int *pfd, int *pfderr)
124{ 127{
125 char *env[2];
126 pid_t pid; 128 pid_t pid;
127#ifdef RLIMIT_CORE 129#ifdef RLIMIT_CORE
128 struct rlimit limit; 130 struct rlimit limit;
@@ -137,8 +139,7 @@ _cmd_open (char *const *argv, int *pfd, int *pfderr)
137 if (!_cmd_pids) 139 if (!_cmd_pids)
138 CMD_INIT; 140 CMD_INIT;
139 141
140 env[0] = strdup ("LC_ALL=C"); 142 setenv("LC_ALL", "C", 1);
141 env[1] = '\0';
142 143
143 if (pipe (pfd) < 0 || pipe (pfderr) < 0 || (pid = fork ()) < 0) 144 if (pipe (pfd) < 0 || pipe (pfderr) < 0 || (pid = fork ()) < 0)
144 return -1; /* errno set by the failing function */ 145 return -1; /* errno set by the failing function */
@@ -169,7 +170,7 @@ _cmd_open (char *const *argv, int *pfd, int *pfderr)
169 if (_cmd_pids[i] > 0) 170 if (_cmd_pids[i] > 0)
170 close (i); 171 close (i);
171 172
172 execve (argv[0], argv, env); 173 execve (argv[0], argv, environ);
173 _exit (STATE_UNKNOWN); 174 _exit (STATE_UNKNOWN);
174 } 175 }
175 176