summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/callproc.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/src/callproc.c b/src/callproc.c
index 7fd218b584d..df5405a07fc 100644
--- a/src/callproc.c
+++ b/src/callproc.c
@@ -463,15 +463,39 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir)
tem = XCONS (tem)->cdr)
new_length++;
- /* new_length + 1 to include terminating 0 */
+ /* new_length + 1 to include terminating 0. */
env = new_env = (char **) alloca ((new_length + 1) * sizeof (char *));
- /* Copy the Vprocess_alist strings into new_env. */
+ /* Copy the Vprocess_environment strings into new_env. */
for (tem = Vprocess_environment;
(XTYPE (tem) == Lisp_Cons
&& XTYPE (XCONS (tem)->car) == Lisp_String);
tem = XCONS (tem)->cdr)
- *new_env++ = (char *) XSTRING (XCONS (tem)->car)->data;
+ {
+ char **ep = env;
+ char *string = (char *) XSTRING (XCONS (tem)->car)->data;
+ /* See if this string duplicates any string already in the env.
+ If so, don't put it in.
+ When an env var has multiple definitions,
+ we keep the definition that comes first in process-environment. */
+ for (; ep != new_env; ep++)
+ {
+ char *p = *ep, *q = string;
+ while (1)
+ {
+ if (*q == 0)
+ /* The string is malformed; might as well drop it. */
+ goto duplicate;
+ if (*q != *p)
+ break;
+ if (*q == '=')
+ goto duplicate;
+ p++, q++;
+ }
+ }
+ *new_env++ = string;
+ duplicate: ;
+ }
*new_env = 0;
}