aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2007-11-01 16:42:39 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2007-11-01 16:42:39 +0000
commit5557813a4e6e7f86b90a64112ad51da79827e512 (patch)
treea87db7af0cc74dd35134e4a4bff638f3af1d4a1e /gcc
parentd6a64b9df961ae0e885a50a6b01fb2b846e60f12 (diff)
downloadgcc-5557813a4e6e7f86b90a64112ad51da79827e512.zip
gcc-5557813a4e6e7f86b90a64112ad51da79827e512.tar.gz
gcc-5557813a4e6e7f86b90a64112ad51da79827e512.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/gcc.c19
2 files changed, 23 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 829201b..e87bbf2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2007-11-01 Nathan Sidwell <nathan@codesourcery.com>
+
+ * gcc.c (getenv_spec_function): Escape the environment variable's
+ value.
+
2007-11-01 Janis Johnson <janis187@us.ibm.com>
* doc/invoke.texi (Optimize Options): Under -fcse-follow-jumps,
diff --git a/gcc/gcc.c b/gcc/gcc.c
index fbbee55..bd26649 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.