diff options
author | Janne Blomqvist <jb@gcc.gnu.org> | 2017-05-11 23:04:53 +0300 |
---|---|---|
committer | Janne Blomqvist <jb@gcc.gnu.org> | 2017-05-11 23:04:53 +0300 |
commit | d86e68e2078bb59e4f4c2c73cd111f8fd509bea4 (patch) | |
tree | cb9fc3d50011847480cbd27facb04872dc66048d /libgfortran/runtime/environ.c | |
parent | ea594612f0478c4307b09704e902da89370a1482 (diff) | |
download | gcc-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.c | 11 |
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 |