From cf2bcf6c7afa8eb7a54e01f98a9998a7e1ac0852 Mon Sep 17 00:00:00 2001 From: Thomas Guyot-Sionnest Date: Fri, 2 Jul 2010 12:55:19 -0400 Subject: [PATCH] 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. --- NEWS | 1 + lib/utils_cmd.c | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 5cbb902..79ddc53 100644 --- a/NEWS +++ b/NEWS @@ -29,6 +29,7 @@ This file documents the major additions and syntax changes between releases. Fix translations when extra-opts aren't enabled (Jan Wagner - #2832884) Fix parsing of multi-line strings in check_snmp (broken in 1.4.14) and enhance output in such case (#2832451) Fix detection of pst3 64-bit compile flags with Sun CC + Fix cmd_run overwriting the environment, which would break some commands that needed it WARNINGS Updated developer documentation to say that performance labels should not have an equals sign or single quote in the label diff --git a/lib/utils_cmd.c b/lib/utils_cmd.c index e10ab91..0c853dc 100644 --- a/lib/utils_cmd.c +++ b/lib/utils_cmd.c @@ -48,6 +48,9 @@ # include #endif +/* used in _cmd_open to pass the environment to commands */ +extern char **environ; + /** macros **/ #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) @@ -122,7 +125,6 @@ cmd_init (void) static int _cmd_open (char *const *argv, int *pfd, int *pfderr) { - char *env[2]; pid_t pid; #ifdef RLIMIT_CORE struct rlimit limit; @@ -137,8 +139,7 @@ _cmd_open (char *const *argv, int *pfd, int *pfderr) if (!_cmd_pids) CMD_INIT; - env[0] = strdup ("LC_ALL=C"); - env[1] = '\0'; + setenv("LC_ALL", "C", 1); if (pipe (pfd) < 0 || pipe (pfderr) < 0 || (pid = fork ()) < 0) return -1; /* errno set by the failing function */ @@ -169,7 +170,7 @@ _cmd_open (char *const *argv, int *pfd, int *pfderr) if (_cmd_pids[i] > 0) close (i); - execve (argv[0], argv, env); + execve (argv[0], argv, environ); _exit (STATE_UNKNOWN); } -- 2.30.2