diff --git a/CHANGES b/CHANGES index f935777..f8d18b3 100644 --- a/CHANGES +++ b/CHANGES @@ -331,6 +331,8 @@ porting: including and a weakness in the conditional code. Thanks to Michel Normand for reporting this issue. + Use 'environ' variable only when provided by runtime + new features: added option max-children that limits the number of concurrent child processes. Thanks to Sam Liddicott for providing the patch. diff --git a/compat.h b/compat.h index 6eb17a1..8906f66 100644 --- a/compat.h +++ b/compat.h @@ -5,6 +5,10 @@ #ifndef __compat_h_included #define __compat_h_included 1 +#if !HAVE_DECL_ENVIRON && HAVE_VAR_ENVIRON +extern char **environ; +#endif + /*****************************************************************************/ /* I dont like this system dependent part, but it would be quite a challenge for configure */ diff --git a/config.h.in b/config.h.in index b94e5f2..17f7de6 100644 --- a/config.h.in +++ b/config.h.in @@ -53,6 +53,13 @@ /* Define if you have the putenv function. */ #undef HAVE_PUTENV +/* Define if your cc provides char **environ declaration. + This implies HAVE_VAR_ENVIRON */ +#undef HAVE_DECL_ENVIRON + +/* Define if you have the char **environ variable */ +#undef HAVE_VAR_ENVIRON + /* Define if you have the select function. */ #undef HAVE_SELECT diff --git a/configure.in b/configure.in index cd4a5c5..1db34e4 100644 --- a/configure.in +++ b/configure.in @@ -1916,6 +1916,29 @@ if test -n "$WITH_FIPS"; then fi AC_SUBST(FIPSLD_CC) +# autoconf does not seem to provide AC_CHECK_VAR or so +# thus we have to check by foot +AC_MSG_CHECKING(for declaration of environ) +AC_CACHE_VAL(sc_cv_decl_environ, +[AC_TRY_COMPILE([#include ],[char **s = environ;], +[sc_cv_decl_environ=yes], +[sc_cv_decl_environ=no])]) +if test $sc_cv_decl_environ = yes; then + AC_DEFINE(HAVE_DECL_ENVIRON) +fi +AC_MSG_RESULT($sc_cv_decl_environ) + +# on some systems environ exists but not the declaration +AC_MSG_CHECKING(for var environ) +AC_CACHE_VAL(sc_cv_var_environ, +[AC_TRY_COMPILE([],[extern char **environ; char **s = environ;], +[sc_cv_var_environ=yes], +[sc_cv_var_environ=no])]) +if test $sc_cv_var_environ = yes; then + AC_DEFINE(HAVE_VAR_ENVIRON) +fi +AC_MSG_RESULT($sc_cv_var_environ) + # allow BUILD_DATE to be externally set for build reproducibility if test "$BUILD_DATE"; then AC_DEFINE_UNQUOTED(BUILD_DATE, ["$BUILD_DATE"]) diff --git a/xio-openssl.c b/xio-openssl.c index a031e35..25e47d7 100644 --- a/xio-openssl.c +++ b/xio-openssl.c @@ -1288,6 +1288,7 @@ static int openssl_delete_cert_info(void) { for (i = 0; i < l; ++i) envprefix[i] = toupper(envprefix[i]); strncat(envprefix+l, "_OPENSSL_", XIO_ENVNAMELEN-l-1); +#if HAVE_VAR_ENVIRON entry = (const char **)environ; while (*entry != NULL) { if (!strncmp(*entry, envprefix, strlen(envprefix))) { @@ -1299,6 +1300,7 @@ static int openssl_delete_cert_info(void) { ++entry; } } +#endif /* HAVE_VAR_ENVIRON */ return 0; }