Commit 5d9d140b authored by jb's avatar jb

PR 63589 Fix splitting of PATH in find_addr2line.

2014-10-20  Janne Blomqvist  <jb@gcc.gnu.org>

	PR libfortran/63589
	* configure.ac: Check for strtok_r.
	* runtime/main.c (gfstrtok_r): Fallback implementation of
	strtok_r.
	(find_addr2line): Use strtok_r to split PATH.
	* config.h.in: Regenerated.
	* configure: Regenerated.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@216450 138bc75d-0d04-0410-961f-82ee72b054a4
parent d45c4c3f
2014-10-20 Janne Blomqvist <jb@gcc.gnu.org>
PR libfortran/63589
* configure.ac: Check for strtok_r.
* runtime/main.c (gfstrtok_r): Fallback implementation of
strtok_r.
(find_addr2line): Use strtok_r to split PATH.
* config.h.in: Regenerated.
* configure: Regenerated.
2014-10-05 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libgfortran/63460
......
......@@ -732,6 +732,9 @@
/* Define to 1 if you have the `strtof' function. */
#undef HAVE_STRTOF
/* Define to 1 if you have the `strtok_r' function. */
#undef HAVE_STRTOK_R
/* Define to 1 if you have the `strtold' function. */
#undef HAVE_STRTOLD
......
......@@ -2599,6 +2599,7 @@ as_fn_append ac_func_list " getegid"
as_fn_append ac_func_list " secure_getenv"
as_fn_append ac_func_list " __secure_getenv"
as_fn_append ac_func_list " mkostemp"
as_fn_append ac_func_list " strtok_r"
as_fn_append ac_header_list " math.h"
# Check that the precious variables saved in the cache have kept the same
# value.
......@@ -12343,7 +12344,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
#line 12346 "configure"
#line 12347 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
......@@ -12449,7 +12450,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
#line 12452 "configure"
#line 12453 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
......@@ -16473,6 +16474,9 @@ $as_echo "#define HAVE_LOCALTIME_R 1" >>confdefs.h
$as_echo "#define HAVE_GMTIME_R 1" >>confdefs.h
$as_echo "#define HAVE_STRTOK_R 1" >>confdefs.h
# At some point, we should differentiate between architectures
# like x86, which have long double versions, and alpha/powerpc/etc.,
# which don't. For the time being, punt.
......@@ -16602,6 +16606,8 @@ done
......
......@@ -272,6 +272,7 @@ if test "x${with_newlib}" = "xyes"; then
AC_DEFINE(HAVE_VSNPRINTF, 1, [Define if you have vsnprintf.])
AC_DEFINE(HAVE_LOCALTIME_R, 1, [Define if you have localtime_r.])
AC_DEFINE(HAVE_GMTIME_R, 1, [Define if you have gmtime_r.])
AC_DEFINE(HAVE_STRTOK_R, 1, [Define if you have strtok_r.])
# At some point, we should differentiate between architectures
# like x86, which have long double versions, and alpha/powerpc/etc.,
......@@ -286,7 +287,7 @@ else
strcasestr getrlimit gettimeofday stat fstat lstat getpwuid vsnprintf dup \
getcwd localtime_r gmtime_r getpwuid_r ttyname_r clock_gettime \
readlink getgid getpid getppid getuid geteuid umask getegid \
secure_getenv __secure_getenv mkostemp)
secure_getenv __secure_getenv mkostemp strtok_r)
fi
# Check strerror_r, cannot be above as versions with two and three arguments exist
......
......@@ -153,6 +153,16 @@ full_exe_path (void)
}
#ifndef HAVE_STRTOK_R
static char*
gfstrtok_r (char *str, const char *delim,
char **saveptr __attribute__ ((unused)))
{
return strtok (str, delim);
}
#define strtok_r gfstrtok_r
#endif
char *addr2line_path;
/* Find addr2line and store the path. */
......@@ -161,30 +171,32 @@ void
find_addr2line (void)
{
#ifdef HAVE_ACCESS
#define A2L_LEN 10
#define A2L_LEN 11
char *path = secure_getenv ("PATH");
if (!path)
return;
char *tp = strdup (path);
if (!tp)
return;
size_t n = strlen (path);
char ap[n + 1 + A2L_LEN];
size_t ai = 0;
for (size_t i = 0; i < n; i++)
char *ap = xmalloc (n + A2L_LEN);
char *saveptr;
for (char *str = tp;; str = NULL)
{
if (path[i] != ':')
ap[ai++] = path[i];
else
char *token = strtok_r (str, ":", &saveptr);
if (!token)
break;
size_t toklen = strlen (token);
memcpy (ap, token, toklen);
memcpy (ap + toklen, "/addr2line", A2L_LEN);
if (access (ap, R_OK|X_OK) == 0)
{
ap[ai++] = '/';
memcpy (ap + ai, "addr2line", A2L_LEN);
if (access (ap, R_OK|X_OK) == 0)
{
addr2line_path = strdup (ap);
return;
}
else
ai = 0;
addr2line_path = strdup (ap);
break;
}
}
free (tp);
free (ap);
#endif
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment