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