1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-09 13:30:26 +02:00

(scm_execl, scm_execlp, scm_execle): Avoid memory leak under error throw.

This commit is contained in:
Kevin Ryde 2004-02-28 19:16:26 +00:00
parent 6841205b19
commit 807f353fed

View file

@ -909,9 +909,13 @@ SCM_DEFINE (scm_execl, "execl", 1, 0, 1,
#define FUNC_NAME s_scm_execl #define FUNC_NAME s_scm_execl
{ {
char **execargv; char **execargv;
int save_errno;
SCM_VALIDATE_STRING (1, filename); SCM_VALIDATE_STRING (1, filename);
execargv = allocate_string_pointers (args); execargv = allocate_string_pointers (args);
execv (SCM_STRING_CHARS (filename), execargv); execv (SCM_STRING_CHARS (filename), execargv);
save_errno = errno;
free (execargv);
errno = save_errno;
SCM_SYSERROR; SCM_SYSERROR;
/* not reached. */ /* not reached. */
return SCM_BOOL_F; return SCM_BOOL_F;
@ -929,9 +933,13 @@ SCM_DEFINE (scm_execlp, "execlp", 1, 0, 1,
#define FUNC_NAME s_scm_execlp #define FUNC_NAME s_scm_execlp
{ {
char **execargv; char **execargv;
int save_errno;
SCM_VALIDATE_STRING (1, filename); SCM_VALIDATE_STRING (1, filename);
execargv = allocate_string_pointers (args); execargv = allocate_string_pointers (args);
execvp (SCM_STRING_CHARS (filename), execargv); execvp (SCM_STRING_CHARS (filename), execargv);
save_errno = errno;
free (execargv);
errno = save_errno;
SCM_SYSERROR; SCM_SYSERROR;
/* not reached. */ /* not reached. */
return SCM_BOOL_F; return SCM_BOOL_F;
@ -969,6 +977,9 @@ environ_list_to_c (SCM envlist, int arg, const char *proc)
return result; return result;
} }
/* OPTIMIZE-ME: scm_execle doesn't need malloced copies of the environment
list strings the way environ_list_to_c gives. */
SCM_DEFINE (scm_execle, "execle", 2, 0, 1, SCM_DEFINE (scm_execle, "execle", 2, 0, 1,
(SCM filename, SCM env, SCM args), (SCM filename, SCM env, SCM args),
"Similar to @code{execl}, but the environment of the new process is\n" "Similar to @code{execl}, but the environment of the new process is\n"
@ -980,12 +991,19 @@ SCM_DEFINE (scm_execle, "execle", 2, 0, 1,
{ {
char **execargv; char **execargv;
char **exec_env; char **exec_env;
int save_errno, i;
SCM_VALIDATE_STRING (1, filename); SCM_VALIDATE_STRING (1, filename);
execargv = allocate_string_pointers (args); execargv = allocate_string_pointers (args);
exec_env = environ_list_to_c (env, SCM_ARG2, FUNC_NAME); exec_env = environ_list_to_c (env, SCM_ARG2, FUNC_NAME);
execve (SCM_STRING_CHARS (filename), execargv, exec_env); execve (SCM_STRING_CHARS (filename), execargv, exec_env);
save_errno = errno;
free (execargv);
for (i = 0; exec_env[i] != NULL; i++)
free (exec_env[i]);
free (exec_env);
errno = save_errno;
SCM_SYSERROR; SCM_SYSERROR;
/* not reached. */ /* not reached. */
return SCM_BOOL_F; return SCM_BOOL_F;