diff options
author | Jakub Jelinek <jakub@redhat.com> | 2012-01-02 23:18:21 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2012-01-02 23:18:21 +0100 |
commit | 341d3f6e9c26e2c5de4f4c57990a8121ec4abb59 (patch) | |
tree | 3393d6f40075e1d70bb7606e7e3efb6a810477c5 /libiberty | |
parent | a4f436ffbb6a31d9aa56e4bebb7ccd9f7cf3bfe5 (diff) | |
download | gcc-341d3f6e9c26e2c5de4f4c57990a8121ec4abb59.zip gcc-341d3f6e9c26e2c5de4f4c57990a8121ec4abb59.tar.gz gcc-341d3f6e9c26e2c5de4f4c57990a8121ec4abb59.tar.bz2 |
re PR driver/48306 (presence of gcc subdir with . in PATH causes breakdown)
* 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.
From-SVN: r182820
Diffstat (limited to 'libiberty')
-rw-r--r-- | libiberty/ChangeLog | 11 | ||||
-rw-r--r-- | libiberty/make-relative-prefix.c | 23 |
2 files changed, 29 insertions, 5 deletions
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index b536611..34d6b6a 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -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. diff --git a/libiberty/make-relative-prefix.c b/libiberty/make-relative-prefix.c index 4553a71..7239e7b 100644 --- a/libiberty/make-relative-prefix.c +++ b/libiberty/make-relative-prefix.c @@ -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) |