diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2014-09-07 13:31:18 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2014-09-07 13:31:18 -0700 |
commit | d5e25ad17f871ed7837fcc5277efce762c112f2a (patch) | |
tree | 3433de7582ee1ea73de2bfeb75b09f4b61afd8a3 /src/callproc.c | |
parent | bee407185922627a073b5fb57daae56043e689b0 (diff) | |
download | emacs-d5e25ad17f871ed7837fcc5277efce762c112f2a.tar.gz |
* callproc.c (exec_failed) [DOS_NT]: Define a dummy.
All callers simplified. Add a comment about exec_failed, vfork,
and alloca.
Diffstat (limited to 'src/callproc.c')
-rw-r--r-- | src/callproc.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/src/callproc.c b/src/callproc.c index 271743021b6..c864471f504 100644 --- a/src/callproc.c +++ b/src/callproc.c @@ -1154,6 +1154,9 @@ add_env (char **env, char **new_env, char *string) #ifndef DOS_NT /* 'exec' failed inside a child running NAME, with error number ERR. + Possibly a vforked child needed to allocate a large vector on the + stack; such a child cannot fall back on malloc because that might + mess up the allocator's data structures in the parent. Report the error and exit the child. */ static _Noreturn void @@ -1168,6 +1171,17 @@ exec_failed (char const *name, int err) emacs_perror (name); _exit (err == ENOENT ? EXIT_ENOENT : EXIT_CANNOT_INVOKE); } + +#else + +/* Do nothing. There is no need to fail, as DOS_NT platforms do not + fork and exec, and handle alloca exhaustion in a different way. */ + +static void +exec_failed (char const *name, int err) +{ +} + #endif /* This is the last thing run in a newly forked inferior @@ -1213,13 +1227,8 @@ child_setup (int in, int out, int err, char **new_argv, bool set_pgrp, on that. */ pwd_var = xmalloc (i + 5); #else - /* WINDOWSNT doesn't define exec_failed, and doesn't need this - test, since a directory name cannot be longer than 260 - characters, i.e. 260 * 4 = 1040 UTF-8 bytes. */ -#ifndef WINDOWSNT if (MAX_ALLOCA - 5 < i) exec_failed (new_argv[0], ENOMEM); -#endif pwd_var = alloca (i + 5); #endif temp = pwd_var + 4; @@ -1286,10 +1295,8 @@ child_setup (int in, int out, int err, char **new_argv, bool set_pgrp, } /* new_length + 2 to include PWD and terminating 0. */ -#ifndef WINDOWSNT if (MAX_ALLOCA / sizeof *env - 2 < new_length) exec_failed (new_argv[0], ENOMEM); -#endif env = new_env = alloca ((new_length + 2) * sizeof *env); /* If we have a PWD envvar, pass one down, but with corrected value. */ @@ -1300,11 +1307,8 @@ child_setup (int in, int out, int err, char **new_argv, bool set_pgrp, { char *vdata; - /* WINDOWSNT doesn't have $DISPLAY. */ -#ifndef WINDOWSNT if (MAX_ALLOCA - sizeof "DISPLAY=" < SBYTES (display)) exec_failed (new_argv[0], ENOMEM); -#endif vdata = alloca (sizeof "DISPLAY=" + SBYTES (display)); strcpy (vdata, "DISPLAY="); strcat (vdata, SSDATA (display)); |