@@ -3729,15 +3729,56 @@ PHP_FUNCTION(ldap_rename_ext)
3729
3729
/* }}} */
3730
3730
3731
3731
#ifdef HAVE_LDAP_START_TLS_S
3732
+ /*
3733
+ Force new tls context creation with string options inherited from global
3734
+ Workaround to https://bugs.openldap.org/show_bug.cgi?id=10337
3735
+ */
3736
+ static int _php_ldap_tls_newctx (LDAP * ld )
3737
+ {
3738
+ int val = 0 , i , opts [] = {
3739
+ #if (LDAP_API_VERSION > 2000 )
3740
+ LDAP_OPT_X_TLS_CACERTDIR ,
3741
+ LDAP_OPT_X_TLS_CACERTFILE ,
3742
+ LDAP_OPT_X_TLS_CERTFILE ,
3743
+ LDAP_OPT_X_TLS_CIPHER_SUITE ,
3744
+ LDAP_OPT_X_TLS_KEYFILE ,
3745
+ LDAP_OPT_X_TLS_RANDOM_FILE ,
3746
+ #endif
3747
+ #ifdef LDAP_OPT_X_TLS_CRLFILE
3748
+ LDAP_OPT_X_TLS_CRLFILE ,
3749
+ #endif
3750
+ #ifdef LDAP_OPT_X_TLS_DHFILE
3751
+ LDAP_OPT_X_TLS_DHFILE ,
3752
+ #endif
3753
+ #ifdef LDAP_OPT_X_TLS_ECNAME
3754
+ LDAP_OPT_X_TLS_ECNAME ,
3755
+ #endif
3756
+ 0 };
3757
+
3758
+ for (i = 0 ; opts [i ] ; i ++ ) {
3759
+ char * path = NULL ;
3760
+
3761
+ ldap_get_option (ld , opts [i ], & path );
3762
+ if (path ) { /* already set locally */
3763
+ ldap_memfree (path );
3764
+ } else {
3765
+ ldap_get_option (NULL , opts [i ], & path );
3766
+ if (path ) { /* set globally, inherit */
3767
+ ldap_set_option (ld , opts [i ], path );
3768
+ ldap_memfree (path );
3769
+ }
3770
+ }
3771
+ }
3772
+
3773
+ return ldap_set_option (ld , LDAP_OPT_X_TLS_NEWCTX , & val );
3774
+ }
3775
+
3732
3776
/* {{{ Start TLS */
3733
3777
PHP_FUNCTION (ldap_start_tls )
3734
3778
{
3735
3779
zval * link ;
3736
3780
ldap_linkdata * ld ;
3737
3781
int rc , protocol = LDAP_VERSION3 ;
3738
- #ifdef LDAP_OPT_X_TLS_NEWCTX
3739
- int val = 0 ;
3740
- #endif
3741
3782
3742
3783
if (zend_parse_parameters (ZEND_NUM_ARGS (), "O" , & link , ldap_link_ce ) != SUCCESS ) {
3743
3784
RETURN_THROWS ();
@@ -3748,7 +3789,7 @@ PHP_FUNCTION(ldap_start_tls)
3748
3789
3749
3790
if (((rc = ldap_set_option (ld -> link , LDAP_OPT_PROTOCOL_VERSION , & protocol )) != LDAP_SUCCESS ) ||
3750
3791
#ifdef LDAP_OPT_X_TLS_NEWCTX
3751
- (LDAPG (tls_newctx ) && (rc = ldap_set_option (ld -> link , LDAP_OPT_X_TLS_NEWCTX , & val )) != LDAP_OPT_SUCCESS ) ||
3792
+ (LDAPG (tls_newctx ) && (rc = _php_ldap_tls_newctx (ld -> link )) != LDAP_OPT_SUCCESS ) ||
3752
3793
#endif
3753
3794
((rc = ldap_start_tls_s (ld -> link , NULL , NULL )) != LDAP_SUCCESS )
3754
3795
) {
0 commit comments