aboutsummaryrefslogtreecommitdiff
path: root/libgfortran/runtime/environ.c
diff options
context:
space:
mode:
authorJanne Blomqvist <jb@gcc.gnu.org>2017-05-11 23:04:53 +0300
committerJanne Blomqvist <jb@gcc.gnu.org>2017-05-11 23:04:53 +0300
commitd86e68e2078bb59e4f4c2c73cd111f8fd509bea4 (patch)
treecb9fc3d50011847480cbd27facb04872dc66048d /libgfortran/runtime/environ.c
parentea594612f0478c4307b09704e902da89370a1482 (diff)
downloadgcc-d86e68e2078bb59e4f4c2c73cd111f8fd509bea4.zip
gcc-d86e68e2078bb59e4f4c2c73cd111f8fd509bea4.tar.gz
gcc-d86e68e2078bb59e4f4c2c73cd111f8fd509bea4.tar.bz2
Don't assume __secure_getenv is available
Glibc 2.17 made __secure_getenv an officially supported function, and renamed it secure_getenv. The libgfortran configure has checked for both of these, per https://sourceware.org/glibc/wiki/Tips_and_Tricks/secure_getenv. Unfortunately, while the dynamical library (libc.so) retains the __secure_getenv symbol for backwards compatibility, the static library (libc.a) does not. This means that a libgfortran.a compiled against an older glibc will not work if one tries to link against a newer libc.a. This creates problems for providing gfortran binary distributions that work on as many target systems as possible. Thus, retain the support for __secure_getenv but call it only via a weak reference. Regtested on x86_64-pc-linux-gnu. 2017-05-11 Janne Blomqvist <jb@gcc.gnu.org> * libgfortran.h: HAVE_SECURE_GETENV: Don't check HAVE___SECURE_GETENV. * environ/runtime.c (secure_getenv): Use __secure_getenv via a weak reference. From-SVN: r247927
Diffstat (limited to 'libgfortran/runtime/environ.c')
-rw-r--r--libgfortran/runtime/environ.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/libgfortran/runtime/environ.c b/libgfortran/runtime/environ.c
index bf02188..969dcdf 100644
--- a/libgfortran/runtime/environ.c
+++ b/libgfortran/runtime/environ.c
@@ -37,9 +37,20 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
provided. */
#ifdef FALLBACK_SECURE_GETENV
+
+#if SUPPORTS_WEAKREF && defined(HAVE___SECURE_GETENV)
+static char* weak_secure_getenv (const char*)
+ __attribute__((__weakref__("__secure_gettime")));
+#endif
+
char *
secure_getenv (const char *name)
{
+#if SUPPORTS_WEAKREF && defined(HAVE__SECURE_GETENV)
+ if (weak_secure_getenv)
+ return weak_secure_getenv (name);
+#endif
+
if ((getuid () == geteuid ()) && (getgid () == getegid ()))
return getenv (name);
else