aboutsummaryrefslogtreecommitdiffstats
path: root/src/callproc.c
diff options
context:
space:
mode:
authorPaul Eggert <[email protected]>2011-03-17 22:56:46 -0700
committerPaul Eggert <[email protected]>2011-03-17 22:56:46 -0700
commitb9c7f648f0a8af1492b32d53e0779198d28d6603 (patch)
tree48e85e1cb2f30e42ff0559421b7176b65b28fdda /src/callproc.c
parent5e41f65daf496cc39cd8bef55a28525b78f97d3d (diff)
* callproc.c (Fcall_process): Use 'volatile' to avoid vfork clobbering.
Diffstat (limited to 'src/callproc.c')
-rw-r--r--src/callproc.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/callproc.c b/src/callproc.c
index 04b8aa3332..75f239d1be 100644
--- a/src/callproc.c
+++ b/src/callproc.c
@@ -180,7 +180,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
(int nargs, register Lisp_Object *args)
{
Lisp_Object infile, buffer, current_dir, path;
- int display_p;
+ volatile int display_p_volatile;
int fd[2];
int filefd;
register int pid;
@@ -190,6 +190,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
int bufsize = CALLPROC_BUFFER_SIZE_MIN;
int count = SPECPDL_INDEX ();
+ const unsigned char **volatile new_argv_volatile;
register const unsigned char **new_argv;
/* File to use for stderr in the child.
t means use same as standard output. */
@@ -343,7 +344,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
UNGCPRO;
}
- display_p = INTERACTIVE && nargs >= 4 && !NILP (args[3]);
+ display_p_volatile = INTERACTIVE && nargs >= 4 && !NILP (args[3]);
filefd = emacs_open (SSDATA (infile), O_RDONLY, 0);
if (filefd < 0)
@@ -371,7 +372,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
&& SREF (path, 1) == ':')
path = Fsubstring (path, make_number (2), Qnil);
- new_argv = (const unsigned char **)
+ new_argv_volatile = new_argv = (const unsigned char **)
alloca (max (2, nargs - 2) * sizeof (char *));
if (nargs > 4)
{
@@ -542,6 +543,8 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
pid = vfork ();
+ new_argv = new_argv_volatile;
+
if (pid == 0)
{
if (fd[0] >= 0)
@@ -673,6 +676,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
int first = 1;
EMACS_INT total_read = 0;
int carryover = 0;
+ int display_p = display_p_volatile;
int display_on_the_fly = display_p;
struct coding_system saved_coding;