@@ -37,7 +37,7 @@
rc = real_execv(file, argv);
environ = orig_environ;
- free(new_environ);
+ pseudo_free_envp(new_environ);
/* return rc;
* }
@@ -30,7 +30,7 @@
sigprocmask(SIG_SETMASK, &pseudo_saved_sigmask, NULL);
rc = real_execve(file, argv, new_environ);
- free(new_environ);
+ pseudo_free_envp(new_environ);
/* return rc;
* }
@@ -37,7 +37,7 @@
rc = real_execvp(file, argv);
environ = orig_environ;
- free(new_environ);
+ pseudo_free_envp(new_environ);
/* return rc;
* }
@@ -29,7 +29,7 @@
sigprocmask(SIG_SETMASK, &pseudo_saved_sigmask, NULL);
rc = real_posix_spawn(pid, path, file_actions, attrp, argv, new_environ);
- free(new_environ);
+ pseudo_free_envp(new_environ);
/* return rc;
* }
@@ -29,7 +29,7 @@
sigprocmask(SIG_SETMASK, &pseudo_saved_sigmask, NULL);
rc = real_posix_spawnp(pid, file, file_actions, attrp, argv, new_environ);
- free(new_environ);
+ pseudo_free_envp(new_environ);
/* return rc;
* }
@@ -24,7 +24,7 @@
rc = real_popen(command, mode);
environ = orig_environ;
- free(new_environ);
+ pseudo_free_envp(new_environ);
/* return rc;
* }
@@ -24,7 +24,7 @@
rc = real_system(command);
environ = orig_environ;
- free(new_environ);
+ pseudo_free_envp(new_environ);
/* return rc;
* }
@@ -69,6 +69,7 @@ extern void pseudo_dropenv(void);
extern char **pseudo_dropenvp(char **);
extern void pseudo_setupenv(void);
extern char **pseudo_setupenvp(char * const *);
+extern void pseudo_free_envp(char **envp);
extern char *pseudo_prefix_path(char *);
extern char *pseudo_bindir_path(char *);
extern char *pseudo_libdir_path(char *);
@@ -1250,6 +1250,17 @@ pseudo_setupenvp(char * const *envp) {
return new_envp;
}
+/* Free data allocated by pseudo_setupenvp() */
+void
+pseudo_free_envp(char **envp) {
+ int i;
+
+ for (i = 0; envp && envp[i]; ++i) {
+ free(envp[i]);
+ }
+ free(envp);
+}
+
/* Append the file value to the prefix value. */
char *
pseudo_append_path(const char * prefix, size_t prefix_len, char *file) {
Add a function to properly clean up the environment array memory after use. Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> --- ports/common/guts/execv.c | 2 +- ports/common/guts/execve.c | 2 +- ports/common/guts/execvp.c | 2 +- ports/common/guts/posix_spawn.c | 2 +- ports/common/guts/posix_spawnp.c | 2 +- ports/unix/guts/popen.c | 2 +- ports/unix/guts/system.c | 2 +- pseudo.h | 1 + pseudo_util.c | 11 +++++++++++ 9 files changed, 19 insertions(+), 7 deletions(-)