@@ -3708,15 +3708,56 @@ PHP_FUNCTION(ldap_rename_ext)
3708
3708
/* }}} */
3709
3709
3710
3710
#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
+
3711
3755
/* {{{ Start TLS */
3712
3756
PHP_FUNCTION (ldap_start_tls )
3713
3757
{
3714
3758
zval * link ;
3715
3759
ldap_linkdata * ld ;
3716
3760
int rc , protocol = LDAP_VERSION3 ;
3717
- #ifdef LDAP_OPT_X_TLS_NEWCTX
3718
- int val = 0 ;
3719
- #endif
3720
3761
3721
3762
if (zend_parse_parameters (ZEND_NUM_ARGS (), "O" , & link , ldap_link_ce ) != SUCCESS ) {
3722
3763
RETURN_THROWS ();
@@ -3727,7 +3768,7 @@ PHP_FUNCTION(ldap_start_tls)
3727
3768
3728
3769
if (((rc = ldap_set_option (ld -> link , LDAP_OPT_PROTOCOL_VERSION , & protocol )) != LDAP_SUCCESS ) ||
3729
3770
#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 ) ||
3731
3772
#endif
3732
3773
((rc = ldap_start_tls_s (ld -> link , NULL , NULL )) != LDAP_SUCCESS )
3733
3774
) {
0 commit comments