]> git.eshelyaron.com Git - emacs.git/commitdiff
Use execve to avoid need to munge environ.
authorPaul Eggert <eggert@cs.ucla.edu>
Sun, 2 Dec 2012 19:16:45 +0000 (11:16 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Sun, 2 Dec 2012 19:16:45 +0000 (11:16 -0800)
* 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
src/ChangeLog
src/callproc.c
src/process.c

index 11ddb1140062cec72cfaa9773fac8ce0a22d3b52..27453ab8a16d9c50acaeed7ab6cd79bd43084b92 100644 (file)
@@ -1,3 +1,12 @@
+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).
index 167663a45c6a0c592535840ce1a71c42c1593f3a..0242755eb5fdcaba50ae741d7ed102a72b0625a8 100644 (file)
@@ -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]));
index b23f06fd025f9a10fcc397dba7343e1ddf86c645..c6139c9f9294e9b62c7dec0c3eba41e2d219c8e0 100644 (file)
@@ -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;