From: Hans Leidekker hans@codeweavers.com
--- dlls/wldap32/option.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/dlls/wldap32/option.c b/dlls/wldap32/option.c index b64b544d1ed..3d63b116e10 100644 --- a/dlls/wldap32/option.c +++ b/dlls/wldap32/option.c @@ -96,6 +96,9 @@ ULONG CDECL ldap_get_optionA( LDAP *ld, int option, void *value ) case WLDAP32_LDAP_OPT_TIMELIMIT: return ldap_get_optionW( ld, option, value );
+ case WLDAP32_LDAP_OPT_REFERRAL_HOP_LIMIT: + return ldap_get_optionW( ld, LDAP_OPT_REFHOPLIMIT, value ); + case WLDAP32_LDAP_OPT_CACHE_ENABLE: case WLDAP32_LDAP_OPT_CACHE_FN_PTRS: case WLDAP32_LDAP_OPT_CACHE_STRATEGY: @@ -122,7 +125,6 @@ ULONG CDECL ldap_get_optionA( LDAP *ld, int option, void *value ) case WLDAP32_LDAP_OPT_PROMPT_CREDENTIALS: case WLDAP32_LDAP_OPT_REF_DEREF_CONN_PER_MSG: case WLDAP32_LDAP_OPT_REFERRAL_CALLBACK: - case WLDAP32_LDAP_OPT_REFERRAL_HOP_LIMIT: case WLDAP32_LDAP_OPT_ROOTDSE_CACHE: case WLDAP32_LDAP_OPT_SASL_METHOD: case WLDAP32_LDAP_OPT_SECURITY_CONTEXT: @@ -215,6 +217,9 @@ ULONG CDECL ldap_get_optionW( LDAP *ld, int option, void *value ) case WLDAP32_LDAP_OPT_TIMELIMIT: return map_error( ldap_get_option( CTX(ld), option, value ) );
+ case WLDAP32_LDAP_OPT_REFERRAL_HOP_LIMIT: + return map_error( ldap_get_option( CTX(ld), LDAP_OPT_REFHOPLIMIT, value ) ); + case WLDAP32_LDAP_OPT_CACHE_ENABLE: case WLDAP32_LDAP_OPT_CACHE_FN_PTRS: case WLDAP32_LDAP_OPT_CACHE_STRATEGY: @@ -241,7 +246,6 @@ ULONG CDECL ldap_get_optionW( LDAP *ld, int option, void *value ) case WLDAP32_LDAP_OPT_PROMPT_CREDENTIALS: case WLDAP32_LDAP_OPT_REF_DEREF_CONN_PER_MSG: case WLDAP32_LDAP_OPT_REFERRAL_CALLBACK: - case WLDAP32_LDAP_OPT_REFERRAL_HOP_LIMIT: case WLDAP32_LDAP_OPT_ROOTDSE_CACHE: case WLDAP32_LDAP_OPT_SASL_METHOD: case WLDAP32_LDAP_OPT_SECURITY_CONTEXT: @@ -459,8 +463,7 @@ ULONG CDECL ldap_set_optionW( LDAP *ld, int option, void *value ) return map_error( ldap_set_option( CTX(ld), option, value ) ); } case WLDAP32_LDAP_OPT_REFERRAL_HOP_LIMIT: - FIXME( "ignoring referral hop limit\n" ); - return WLDAP32_LDAP_SUCCESS; + return map_error( ldap_set_option( CTX(ld), LDAP_OPT_REFHOPLIMIT, value ) );
case WLDAP32_LDAP_OPT_SERVER_CERTIFICATE: CERT_CALLBACK(ld) = value;
From: Hans Leidekker hans@codeweavers.com
--- dlls/wldap32/init.c | 12 ++++---- dlls/wldap32/winldap_private.h | 51 +++++++++++++++++++--------------- 2 files changed, 33 insertions(+), 30 deletions(-)
diff --git a/dlls/wldap32/init.c b/dlls/wldap32/init.c index f1fd33cd34e..519466da1ee 100644 --- a/dlls/wldap32/init.c +++ b/dlls/wldap32/init.c @@ -256,12 +256,10 @@ ULONG CDECL WLDAP32_ldap_connect( LDAP *ld, struct l_timeval *timeout ) TRACE( "(%p, %p)\n", ld, timeout );
if (!ld) return WLDAP32_LDAP_PARAM_ERROR; + if (CONNECTED(ld)) return WLDAP32_LDAP_SUCCESS;
- if (timeout && (timeout->tv_sec || timeout->tv_usec)) - FIXME( "ignoring timeout\n" ); - - if ((ret = ldap_connect( CTX(ld) ))) - return map_error( ret ); + if (timeout && (timeout->tv_sec || timeout->tv_usec)) FIXME( "ignoring timeout\n" ); + if ((ret = ldap_connect( CTX(ld) ))) return map_error( ret );
if (cert_callback) { @@ -285,6 +283,7 @@ ULONG CDECL WLDAP32_ldap_connect( LDAP *ld, struct l_timeval *timeout ) } }
+ CONNECTED(ld) = TRUE; return WLDAP32_LDAP_SUCCESS; }
@@ -456,9 +455,8 @@ ULONG CDECL ldap_start_tls_sW( LDAP *ld, ULONG *retval, LDAPMessage **result, LD if (clientctrls && !(clientctrlsU = controlarrayWtoU( clientctrls ))) goto exit; else { + if (CONNECTED(ld)) return WLDAP32_LDAP_LOCAL_ERROR; ret = map_error( ldap_start_tls_s( CTX(ld), serverctrlsU, clientctrlsU ) ); - if (!ret && WLDAP32_ldap_connect( ld, NULL ) != WLDAP32_LDAP_SUCCESS) - ret = WLDAP32_LDAP_LOCAL_ERROR; }
exit: diff --git a/dlls/wldap32/winldap_private.h b/dlls/wldap32/winldap_private.h index a4f2caf7772..e31dcbb6207 100644 --- a/dlls/wldap32/winldap_private.h +++ b/dlls/wldap32/winldap_private.h @@ -194,16 +194,17 @@ typedef struct WLDAP32_berelement char *opaque; } WLDAP32_BerElement;
-typedef struct ldap +struct ld_sb { - struct - { - UINT_PTR sb_sd; - UCHAR Reserved1[41]; - ULONG_PTR sb_naddr; - UCHAR Reserved2[24]; - } ld_sb; + UINT_PTR sb_sd; + UCHAR Reserved1[41]; + ULONG_PTR sb_naddr; + UCHAR Reserved2[24]; +};
+typedef struct ldap +{ + struct ld_sb ld_sb; char *ld_host; ULONG ld_version; UCHAR ld_lberoptions; @@ -221,6 +222,25 @@ typedef struct ldap ULONG ld_options; } LDAP, *PLDAP;
+typedef BOOLEAN (CDECL VERIFYSERVERCERT)(LDAP *, const CERT_CONTEXT **); + +struct private_data +{ + LDAP *ctx; + struct berval **server_ctrls; + VERIFYSERVERCERT *cert_callback; + BOOL connected; +}; +C_ASSERT(sizeof(struct private_data) < FIELD_OFFSET(struct ld_sb, sb_naddr) - FIELD_OFFSET(struct ld_sb, Reserved1)); + +#define CTX(ld) (((struct private_data *)ld->ld_sb.Reserved1)->ctx) +#define SERVER_CTRLS(ld) (((struct private_data *)ld->ld_sb.Reserved1)->server_ctrls) +#define CERT_CALLBACK(ld) (((struct private_data *)ld->ld_sb.Reserved1)->cert_callback) +#define CONNECTED(ld) (((struct private_data *)ld->ld_sb.Reserved1)->connected) + +#define MSG(entry) (entry->Request) +#define BER(ber) ((BerElement *)((ber)->opaque)) + typedef struct l_timeval { LONG tv_sec; @@ -366,21 +386,6 @@ typedef struct ldapsearch struct WLDAP32_berval *cookie; } LDAPSearch;
-typedef BOOLEAN (CDECL VERIFYSERVERCERT)(LDAP*,const CERT_CONTEXT**); - -struct private_data -{ - LDAP *ctx; - struct berval **server_ctrls; - VERIFYSERVERCERT *cert_callback; -}; - -#define CTX(ld) (((struct private_data *)ld->Reserved3)->ctx) -#define SERVER_CTRLS(ld) (((struct private_data *)ld->Reserved3)->server_ctrls) -#define CERT_CALLBACK(ld) (((struct private_data *)ld->Reserved3)->cert_callback) -#define MSG(entry) (entry->Request) -#define BER(ber) ((BerElement *)((ber)->opaque)) - void CDECL WLDAP32_ber_bvecfree( BERVAL ** ); void CDECL WLDAP32_ber_bvfree( BERVAL * ); void CDECL WLDAP32_ber_free( WLDAP32_BerElement *, int );
On Fri Apr 7 11:32:40 2023 +0000, Hans Leidekker wrote:
changed this line in [version 2 of the diff](/wine/wine/-/merge_requests/2605/diffs?diff_id=41244&start_sha=d03076a0d820935050aa8e5f163695906f3dc6aa#e51852c79c650814328bf0aa6b3f635c79f151da_29_29)
Alright, I removed that commit.