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.

Backported from trunk.

2017-05-19  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.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-6-branch@248274 138bc75d-0d04-0410-961f-82ee72b054a4
This commit is contained in:
jb 2017-05-19 13:27:26 +00:00
parent 5061dddb9b
commit 51036c2cc6
3 changed files with 20 additions and 3 deletions

View File

@ -1,3 +1,11 @@
2017-05-19 Janne Blomqvist <jb@gcc.gnu.org>
Backport from trunk
* libgfortran.h: HAVE_SECURE_GETENV: Don't check
HAVE___SECURE_GETENV.
* environ/runtime.c (secure_getenv): Use __secure_getenv via a
weak reference.
2017-01-31 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/79305

View File

@ -801,9 +801,7 @@ internal_proto(get_unformatted_convert);
/* Secure getenv() which returns NULL if running as SUID/SGID. */
#ifndef HAVE_SECURE_GETENV
#ifdef HAVE___SECURE_GETENV
#define secure_getenv __secure_getenv
#elif defined(HAVE_GETUID) && defined(HAVE_GETEUID) \
#if defined(HAVE_GETUID) && defined(HAVE_GETEUID) \
&& defined(HAVE_GETGID) && defined(HAVE_GETEGID)
#define FALLBACK_SECURE_GETENV
extern char *secure_getenv (const char *);

View File

@ -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_getenv")));
#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