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
This commit is contained in:
Jakub Jelinek 2012-01-02 23:18:21 +01:00 committed by Jakub Jelinek
parent a4f436ffbb
commit 341d3f6e9c
2 changed files with 29 additions and 5 deletions

View 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.

View 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)