From d5e25ad17f871ed7837fcc5277efce762c112f2a Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 7 Sep 2014 13:31:18 -0700 Subject: [PATCH] * callproc.c (exec_failed) [DOS_NT]: Define a dummy. All callers simplified. Add a comment about exec_failed, vfork, and alloca. --- src/ChangeLog | 4 ++++ src/callproc.c | 24 ++++++++++++++---------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 777dcd81af2..88ab1eedca8 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,9 @@ 2014-09-07 Paul Eggert + * callproc.c (exec_failed) [DOS_NT]: Define a dummy. + All callers simplified. Add a comment about exec_failed, vfork, + and alloca. + Adjust drag-and-drop fix when window is above top (Bug#18303). * xselect.c (x_fill_property_data): Don't let sign bit of negative XCDR bleed into XCAR's encoded value. Improve checks for 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)); -- 2.39.5