This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: strip out ".." from gcc search paths


This modifies update_path `..' stripping code to make it a little
safer.  Since someone found a problem with stripping leading `.'s,
I've been worried there are other latent bugs lurking.

gcc/ChangeLog
	* prefix.c (update_path): Don't strip single `.' path components
	unless stripping a later `..' component.  Exit loop as soon as
	a valid path is found.

OK mainline?

-- 
Alan Modra
IBM OzLabs - Linux Technology Centre

Index: gcc/prefix.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/prefix.c,v
retrieving revision 1.36
diff -u -p -r1.36 prefix.c
--- gcc/prefix.c	19 Jul 2002 13:24:55 -0000	1.36
+++ gcc/prefix.c	24 Jul 2002 03:08:02 -0000
@@ -284,49 +284,39 @@ update_path (path, key)
       p = strchr (p, '.');
       if (p == NULL)
 	break;
-      /* Get rid of a leading `./' and replace `/./' with `/', when
-	 such components are followed with another `.'.  */
-      if (IS_DIR_SEPARATOR (p[1])
-	  && (p == result || IS_DIR_SEPARATOR (p[-1])))
-	{
-	  src = p + 2;
-	  /* Be careful about .//foo  */
-	  while (IS_DIR_SEPARATOR (*src))
-	    ++src;
-	  if (*src == '.')
-	    {
-	      dest = p;
-	      while ((*dest++ = *src++) != 0)
-		;
-	    }
-	  else
-	    ++p;
-	}
       /* Look for `/../'  */
-      else if (p[1] == '.'
-	       && IS_DIR_SEPARATOR (p[2])
-	       && (p != result && IS_DIR_SEPARATOR (p[-1])))
+      if (p[1] == '.'
+	  && IS_DIR_SEPARATOR (p[2])
+	  && (p != result && IS_DIR_SEPARATOR (p[-1])))
 	{
 	  *p = 0;
 	  if (!ALWAYS_STRIP_DOTDOT && access (result, X_OK) == 0)
 	    {
 	      *p = '.';
-	      p += 3;
+	      break;
 	    }
 	  else
 	    {
 	      /* We can't access the dir, so we won't be able to
-		 access dir/.. either.  Strip out dir/..  We know dir
-		 isn't `.' because we've rid ourselves of `.' path
-		 components above.  */
-	      dest = p - 1;
-	      while (dest != result && IS_DIR_SEPARATOR (*dest))
-		--dest;
-	      while (dest != result && !IS_DIR_SEPARATOR (dest[-1]))
-		--dest;
-	      /* Don't strip leading `/'.  */
-	      while (IS_DIR_SEPARATOR (*dest))
-		++dest;
+		 access dir/.. either.  Strip out `dir/..'.  If `dir'
+		 turns out to be `.', strip one more path component.  */
+	      dest = p;
+	      do
+		{
+		  --dest;
+		  while (dest != result && IS_DIR_SEPARATOR (*dest))
+		    --dest;
+		  while (dest != result && !IS_DIR_SEPARATOR (dest[-1]))
+		    --dest;
+		}
+	      while (dest != result && *dest == '.');
+	      /* If we have something like `./..' or `/..', don't
+		 strip anything more.  */
+	      if (*dest == '.' || IS_DIR_SEPARATOR (*dest))
+		{
+		  *p = '.';
+		  break;
+		}
 	      src = p + 3;
 	      while (IS_DIR_SEPARATOR (*src))
 		++src;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]