@@ -3708,15 +3708,56 @@ PHP_FUNCTION(ldap_rename_ext)
37083708/* }}} */
37093709
37103710#ifdef HAVE_LDAP_START_TLS_S
3711+ /*
3712+ Force new tls context creation with string options inherited from global
3713+ Workaround to https://bugs.openldap.org/show_bug.cgi?id=10337
3714+ */
3715+ static int _php_ldap_tls_newctx (LDAP * ld )
3716+ {
3717+ int val = 0 , i , opts [] = {
3718+ #if (LDAP_API_VERSION > 2000 )
3719+ LDAP_OPT_X_TLS_CACERTDIR ,
3720+ LDAP_OPT_X_TLS_CACERTFILE ,
3721+ LDAP_OPT_X_TLS_CERTFILE ,
3722+ LDAP_OPT_X_TLS_CIPHER_SUITE ,
3723+ LDAP_OPT_X_TLS_KEYFILE ,
3724+ LDAP_OPT_X_TLS_RANDOM_FILE ,
3725+ #endif
3726+ #ifdef LDAP_OPT_X_TLS_CRLFILE
3727+ LDAP_OPT_X_TLS_CRLFILE ,
3728+ #endif
3729+ #ifdef LDAP_OPT_X_TLS_DHFILE
3730+ LDAP_OPT_X_TLS_DHFILE ,
3731+ #endif
3732+ #ifdef LDAP_OPT_X_TLS_ECNAME
3733+ LDAP_OPT_X_TLS_ECNAME ,
3734+ #endif
3735+ 0 };
3736+
3737+ for (i = 0 ; opts [i ] ; i ++ ) {
3738+ char * path = NULL ;
3739+
3740+ ldap_get_option (ld , opts [i ], & path );
3741+ if (path ) { /* already set locally */
3742+ ldap_memfree (path );
3743+ } else {
3744+ ldap_get_option (NULL , opts [i ], & path );
3745+ if (path ) { /* set globally, inherit */
3746+ ldap_set_option (ld , opts [i ], path );
3747+ ldap_memfree (path );
3748+ }
3749+ }
3750+ }
3751+
3752+ return ldap_set_option (ld , LDAP_OPT_X_TLS_NEWCTX , & val );
3753+ }
3754+
37113755/* {{{ Start TLS */
37123756PHP_FUNCTION (ldap_start_tls )
37133757{
37143758 zval * link ;
37153759 ldap_linkdata * ld ;
37163760 int rc , protocol = LDAP_VERSION3 ;
3717- #ifdef LDAP_OPT_X_TLS_NEWCTX
3718- int val = 0 ;
3719- #endif
37203761
37213762 if (zend_parse_parameters (ZEND_NUM_ARGS (), "O" , & link , ldap_link_ce ) != SUCCESS ) {
37223763 RETURN_THROWS ();
@@ -3727,7 +3768,7 @@ PHP_FUNCTION(ldap_start_tls)
37273768
37283769 if (((rc = ldap_set_option (ld -> link , LDAP_OPT_PROTOCOL_VERSION , & protocol )) != LDAP_SUCCESS ) ||
37293770#ifdef LDAP_OPT_X_TLS_NEWCTX
3730- (LDAPG (tls_newctx ) && (rc = ldap_set_option (ld -> link , LDAP_OPT_X_TLS_NEWCTX , & val )) != LDAP_OPT_SUCCESS ) ||
3771+ (LDAPG (tls_newctx ) && (rc = _php_ldap_tls_newctx (ld -> link )) != LDAP_OPT_SUCCESS ) ||
37313772#endif
37323773 ((rc = ldap_start_tls_s (ld -> link , NULL , NULL )) != LDAP_SUCCESS )
37333774 ) {
0 commit comments