Commit 21e54a94 authored by Paul Eggert's avatar Paul Eggert
Browse files

Use execve to avoid need to munge environ.

* callproc.c (Fcall_process):
* process.c (create_process):
Don't save and restore environ;	no longer needed.
* callproc.c (child_setup):
Use execve, not execvp, to preserve environ.

Fixes: debbugs:13054
parent 010db6da
2012-12-02 Paul Eggert <eggert@cs.ucla.edu>
Use execve to avoid need to munge environ (Bug#13054).
* callproc.c (Fcall_process):
* process.c (create_process):
Don't save and restore environ; no longer needed.
* callproc.c (child_setup):
Use execve, not execvp, to preserve environ.
2012-12-01 Paul Eggert <eggert@cs.ucla.edu>
 
* xterm.c (x_draw_image_relief): Remove unused locals (Bug#10500).
......
......@@ -488,9 +488,6 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
}
{
/* child_setup must clobber environ in systems with true vfork.
Protect it from permanent change. */
char **save_environ = environ;
int fd_error = fd1;
if (fd_output >= 0)
......@@ -594,7 +591,6 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
ptrdiff_t volatile count_volatile = count;
ptrdiff_t volatile sa_count_volatile = sa_count;
char **volatile new_argv_volatile = new_argv;
char **volatile new_save_environ = save_environ;
pid = vfork ();
......@@ -612,7 +608,6 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
count = count_volatile;
sa_count = sa_count_volatile;
new_argv = new_argv_volatile;
save_environ = new_save_environ;
}
if (pid == 0)
......@@ -638,8 +633,6 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
emacs_close (fd_error);
#endif /* not MSDOS */
environ = save_environ;
/* Close most of our file descriptors, but not fd0
since we will use that to read input from. */
emacs_close (filefd);
......@@ -1092,10 +1085,6 @@ add_env (char **env, char **new_env, char *string)
Initialize inferior's priority, pgrp, connected dir and environment.
then exec another program based on new_argv.
This function may change environ for the superior process.
Therefore, the superior process must save and restore the value
of environ around the vfork and the call to this function.
If SET_PGRP, put the subprocess into a separate process group.
CURRENT_DIR is an elisp string giving the path of the current
......@@ -1298,11 +1287,7 @@ child_setup (int in, int out, int err, char **new_argv, bool set_pgrp,
setpgid (0, 0);
tcsetpgrp (0, pid);
/* execvp does not accept an environment arg so the only way
to pass this environment is to set environ. Our caller
is responsible for restoring the ambient value of environ. */
environ = env;
execvp (new_argv[0], new_argv);
execve (new_argv[0], new_argv, env);
emacs_write (1, "Can't exec program: ", 20);
emacs_write (1, new_argv[0], strlen (new_argv[0]));
......
......@@ -1586,9 +1586,6 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir)
volatile int pty_flag = 0;
volatile Lisp_Object lisp_pty_name = Qnil;
volatile Lisp_Object encoded_current_dir;
#if HAVE_WORKING_VFORK
char **volatile save_environ;
#endif
inchannel = outchannel = -1;
......@@ -1688,12 +1685,6 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir)
pthread_sigmask (SIG_BLOCK, &blocked, 0);
#endif
#if HAVE_WORKING_VFORK
/* child_setup must clobber environ on systems with true vfork.
Protect it from permanent change. */
save_environ = environ;
#endif
#ifndef WINDOWSNT
pid = vfork ();
if (pid == 0)
......@@ -1819,10 +1810,6 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir)
/* Back in the parent process. */
#if HAVE_WORKING_VFORK
environ = save_environ;
#endif
XPROCESS (process)->pid = pid;
if (0 <= pid)
XPROCESS (process)->alive = 1;
......@@ -1874,7 +1861,7 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir)
/* Wait for child_setup to complete in case that vfork is
actually defined as fork. The descriptor wait_child_setup[1]
of a pipe is closed at the child side either by close-on-exec
on successful execvp or the _exit call in child_setup. */
on successful execve or the _exit call in child_setup. */
{
char dummy;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment