merge from gcc
authorDJ Delorie <dj@redhat.com>
Tue, 3 Jan 2012 16:02:36 +0000 (16:02 +0000)
committerDJ Delorie <dj@redhat.com>
Tue, 3 Jan 2012 16:02:36 +0000 (16:02 +0000)
libiberty/ChangeLog
libiberty/make-relative-prefix.c

index b5366111c1eb4e69e21bd4e6486dba2ba642929f..34d6b6ad8c512ee6ac2e9b61ece0efdc5da1ac2c 100644 (file)
@@ -1,3 +1,14 @@
+2012-01-02  Jakub Jelinek  <jakub@redhat.com>
+
+       * make-relative-prefix.c (make_relative_prefix_1): Avoid
+       stack overflow if PATH contains just a single entry and
+       HOST_EXECUTABLE_SUFFIX needs to be used.
+
+       PR driver/48306
+       * make-relative-prefix.c: Include sys/stat.h.
+       (make_relative_prefix_1): If access succeeds, check also stat
+       if nstore is a regular file.
+
 2011-12-20  Andreas Schwab  <schwab@linux-m68k.org>
 
        * configure: Regenerate.
index 4553a7109d8244ec0ad572f6d5f415e7927824cf..7239e7b0bae2d98c8f201775f63ffc4073526647 100644 (file)
@@ -1,6 +1,6 @@
 /* Relative (relocatable) prefix support.
    Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001, 2002, 2006 Free Software Foundation, Inc.
+   1999, 2000, 2001, 2002, 2006, 2012 Free Software Foundation, Inc.
 
 This file is part of libiberty.
 
@@ -58,6 +58,9 @@ relative prefix can be found, return @code{NULL}.
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
 
 #include <string.h>
 
@@ -248,7 +251,11 @@ make_relative_prefix_1 (const char *progname, const char *bin_prefix,
          if (prefixlen < 2)
            prefixlen = 2;
 
-         nstore = (char *) alloca (prefixlen + strlen (progname) + 1);
+         nstore = (char *) alloca (prefixlen + strlen (progname) + 1
+#ifdef HAVE_HOST_EXECUTABLE_SUFFIX
+                                   + strlen (HOST_EXECUTABLE_SUFFIX)
+#endif
+                                   );
 
          startp = endp = temp;
          while (1)
@@ -263,7 +270,7 @@ make_relative_prefix_1 (const char *progname, const char *bin_prefix,
                    }
                  else
                    {
-                     strncpy (nstore, startp, endp - startp);
+                     memcpy (nstore, startp, endp - startp);
                      if (! IS_DIR_SEPARATOR (endp[-1]))
                        {
                          nstore[endp - startp] = DIR_SEPARATOR;
@@ -279,8 +286,14 @@ make_relative_prefix_1 (const char *progname, const char *bin_prefix,
 #endif
                      )
                    {
-                     progname = nstore;
-                     break;
+#if defined (HAVE_SYS_STAT_H) && defined (S_ISREG)
+                     struct stat st;
+                     if (stat (nstore, &st) >= 0 && S_ISREG (st.st_mode))
+#endif
+                       {
+                         progname = nstore;
+                         break;
+                       }
                    }
 
                  if (*endp == 0)