diff options
author | Eric Andersen <andersen@codepoet.org> | 2005-04-27 15:44:11 +0400 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2005-04-27 15:44:11 +0400 |
commit | 70a5a1abdedabca165deee2dcbe497c5307db1d0 (patch) | |
tree | b1a41edfd3a1eb50b918bbdd09e41a0d1c13ee4f /networking | |
parent | fef32b570bbf9226778482e2f3f693b83d4e9c65 (diff) |
Do not attempt to free() the application's environment, which is was
not dynamically allocated. Instead, use a private variable to store
the environment array, which is used when we exec applications.
Diffstat (limited to 'networking')
-rw-r--r-- | networking/ifupdown.c | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/networking/ifupdown.c b/networking/ifupdown.c index 916948175..e07167aef 100644 --- a/networking/ifupdown.c +++ b/networking/ifupdown.c @@ -150,9 +150,7 @@ struct interfaces_file_t static char no_act = 0; static char verbose = 0; -#ifndef __USE_GNU -static char **environ = NULL; -#endif +static char **__myenviron = NULL; #ifdef CONFIG_FEATURE_IFUPDOWN_IP @@ -963,16 +961,16 @@ static void set_environ(struct interface_defn_t *iface, char *mode) const int n_env_entries = iface->n_options + 5; char **ppch; - if (environ != NULL) { - for (ppch = environ; *ppch; ppch++) { + if (__myenviron != NULL) { + for (ppch = __myenviron; *ppch; ppch++) { free(*ppch); *ppch = NULL; } - free(environ); - environ = NULL; + free(__myenviron); + __myenviron = NULL; } - environ = xmalloc(sizeof(char *) * (n_env_entries + 1 /* for final NULL */ )); - environend = environ; + __myenviron = xmalloc(sizeof(char *) * (n_env_entries + 1 /* for final NULL */ )); + environend = __myenviron; *environend = NULL; for (i = 0; i < iface->n_options; i++) { @@ -1012,7 +1010,7 @@ static int doit(char *str) case -1: /* failure */ return 0; case 0: /* child */ - execle(DEFAULT_SHELL, DEFAULT_SHELL, "-c", str, NULL, environ); + execle(DEFAULT_SHELL, DEFAULT_SHELL, "-c", str, NULL, __myenviron); exit(127); } waitpid(child, &status, 0); |