hardening: Use __secure_getenv if available

This helps us in the case where we were executed via filesystem
capabilities or a SELinux domain transition, not necessarily a plain
old setuid binary.

https://bugs.freedesktop.org/show_bug.cgi?id=52202
This commit is contained in:
Colin Walters 2012-09-27 21:29:29 -04:00
parent 23fe78ceef
commit d839f027ed
2 changed files with 7 additions and 1 deletions

View file

@ -595,7 +595,7 @@ AC_DEFINE_UNQUOTED([DBUS_USE_SYNC], [$have_sync], [Use the gcc __sync extension]
AC_SEARCH_LIBS(socket,[socket network])
AC_CHECK_FUNC(gethostbyname,,[AC_CHECK_LIB(nsl,gethostbyname)])
AC_CHECK_FUNCS(vsnprintf vasprintf nanosleep usleep setenv clearenv unsetenv socketpair getgrouplist fpathconf setrlimit poll setlocale localeconv strtoll strtoull issetugid getresuid)
AC_CHECK_FUNCS(vsnprintf vasprintf nanosleep usleep setenv clearenv unsetenv socketpair getgrouplist fpathconf setrlimit poll setlocale localeconv strtoll strtoull issetugid getresuid secure_getenv __secure_getenv )
AC_CHECK_HEADERS([syslog.h])
if test "x$ac_cv_header_syslog_h" = "xyes"; then

View file

@ -182,12 +182,18 @@ _dbus_setenv (const char *varname,
const char*
_dbus_getenv (const char *varname)
{
#if defined(HAVE_SECURE_GETENV)
return secure_getenv (varname);
#elif defined(HAVE___SECURE_GETENV)
return __secure_getenv (varname);
#else
/* Don't respect any environment variables if the current process is
* setuid. This is the equivalent of glibc's __secure_getenv().
*/
if (_dbus_check_setuid ())
return NULL;
return getenv (varname);
#endif
}
/**