From 5557813a4e6e7f86b90a64112ad51da79827e512 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Thu, 1 Nov 2007 16:42:39 +0000 Subject: [PATCH] gcc.c (getenv_spec_function): Escape the environment variable's value. * gcc.c (getenv_spec_function): Escape the environment variable's value. From-SVN: r129825 --- gcc/ChangeLog | 5 +++++ gcc/gcc.c | 19 ++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 829201beb21..e87bbf21d19 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2007-11-01 Nathan Sidwell + + * gcc.c (getenv_spec_function): Escape the environment variable's + value. + 2007-11-01 Janis Johnson * doc/invoke.texi (Optimize Options): Under -fcse-follow-jumps, diff --git a/gcc/gcc.c b/gcc/gcc.c index fbbee556064..bd266496ac7 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -7734,6 +7734,9 @@ static const char * getenv_spec_function (int argc, const char **argv) { char *value; + char *result; + char *ptr; + size_t len; if (argc != 2) return NULL; @@ -7742,7 +7745,21 @@ getenv_spec_function (int argc, const char **argv) if (!value) fatal ("environment variable \"%s\" not defined", argv[0]); - return concat (value, argv[1], NULL); + /* We have to escape every character of the environment variable so + they are not interpretted as active spec characters. A + particulaly painful case is when we are reading a variable + holding a windows path complete with \ separators. */ + len = strlen (value) * 2 + strlen (argv[1]) + 1; + result = xmalloc (len); + for (ptr = result; *value; ptr += 2) + { + ptr[0] = '\\'; + ptr[1] = *value++; + } + + strcpy (ptr, argv[1]); + + return result; } /* if-exists built-in spec function. -- 2.30.2