mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-09 21:40:33 +02:00
(scm_execl, scm_execlp, scm_execle): Avoid memory leak under error throw.
This commit is contained in:
parent
6841205b19
commit
807f353fed
1 changed files with 18 additions and 0 deletions
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue