OSDN Git Service

* gcc.c (getenv_spec_function): Escape the environment variable's
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 1 Nov 2007 16:42:39 +0000 (16:42 +0000)
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 1 Nov 2007 16:42:39 +0000 (16:42 +0000)
value.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@129825 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/gcc.c

index 829201b..e87bbf2 100644 (file)
@@ -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,
index fbbee55..bd26649 100644 (file)
--- 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.