Module: wine Branch: master Commit: a114ce67db2357740eb58fbda0102e582e79c11c URL: https://source.winehq.org/git/wine.git/?a=commit;h=a114ce67db2357740eb58fbda...
Author: Hans Leidekker hans@codeweavers.com Date: Wed Mar 10 15:50:27 2021 +0100
secur32: Add support for setting DTLS MTU.
Signed-off-by: Hans Leidekker hans@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/secur32/schannel.c | 7 +++++++ dlls/secur32/schannel_gnutls.c | 20 ++++++++++++++++++++ dlls/secur32/schannel_macosx.c | 6 ++++++ dlls/secur32/secur32_priv.h | 1 + 4 files changed, 34 insertions(+)
diff --git a/dlls/secur32/schannel.c b/dlls/secur32/schannel.c index 9a1dfd42152..e7673a7f814 100644 --- a/dlls/secur32/schannel.c +++ b/dlls/secur32/schannel.c @@ -879,6 +879,13 @@ static SECURITY_STATUS SEC_ENTRY schan_InitializeSecurityContextW( schan_imp_set_application_protocols(ctx->session, buffer->pvBuffer, buffer->cbBuffer); }
+ if (pInput && (idx = schan_find_sec_buffer_idx(pInput, 0, SECBUFFER_DTLS_MTU)) != -1) + { + buffer = &pInput->pBuffers[idx]; + if (buffer->cbBuffer >= sizeof(WORD)) schan_imp_set_dtls_mtu(ctx->session, *(WORD *)buffer->pvBuffer); + else WARN("invalid buffer size %u\n", buffer->cbBuffer); + } + phNewContext->dwLower = handle; phNewContext->dwUpper = 0; } diff --git a/dlls/secur32/schannel_gnutls.c b/dlls/secur32/schannel_gnutls.c index fbf9277a39c..785430ddf58 100644 --- a/dlls/secur32/schannel_gnutls.c +++ b/dlls/secur32/schannel_gnutls.c @@ -53,6 +53,7 @@ static int (*pgnutls_cipher_get_block_size)(gnutls_cipher_algorithm_t); /* Not present in gnutls version < 3.0. */ static void (*pgnutls_transport_set_pull_timeout_function)(gnutls_session_t, int (*)(gnutls_transport_ptr_t, unsigned int)); +static void (*pgnutls_dtls_set_mtu)(gnutls_session_t, unsigned int);
/* Not present in gnutls version < 3.2.0. */ static int (*pgnutls_alpn_get_selected_protocol)(gnutls_session_t, gnutls_datum_t *); @@ -186,6 +187,11 @@ static int compat_gnutls_alpn_set_protocols(gnutls_session_t session, const gnut return GNUTLS_E_INVALID_REQUEST; }
+static void compat_gnutls_dtls_set_mtu(gnutls_session_t session, unsigned int mtu) +{ + FIXME("\n"); +} + static ssize_t schan_pull_adapter(gnutls_transport_ptr_t transport, void *buff, size_t buff_len) { @@ -767,6 +773,15 @@ SECURITY_STATUS schan_imp_get_application_protocol(schan_imp_session session, return SEC_E_OK; }
+SECURITY_STATUS schan_imp_set_dtls_mtu(schan_imp_session session, unsigned int mtu) +{ + gnutls_session_t s = (gnutls_session_t)session; + + pgnutls_dtls_set_mtu(s, mtu); + TRACE("MTU set to %u\n", mtu); + return SEC_E_OK; +} + static WCHAR *get_key_container_path(const CERT_CONTEXT *ctx) { static const WCHAR rsabaseW[] = @@ -1130,6 +1145,11 @@ BOOL schan_imp_init(void) WARN("gnutls_alpn_get_selected_protocol not found\n"); pgnutls_alpn_get_selected_protocol = compat_gnutls_alpn_get_selected_protocol; } + if (!(pgnutls_dtls_set_mtu = dlsym(libgnutls_handle, "gnutls_dtls_set_mtu"))) + { + WARN("gnutls_dtls_set_mtu not found\n"); + pgnutls_dtls_set_mtu = compat_gnutls_dtls_set_mtu; + } if (!(pgnutls_privkey_export_x509 = dlsym(libgnutls_handle, "gnutls_privkey_export_x509"))) { WARN("gnutls_privkey_export_x509 not found\n"); diff --git a/dlls/secur32/schannel_macosx.c b/dlls/secur32/schannel_macosx.c index 6e6296722cc..ab97615014d 100644 --- a/dlls/secur32/schannel_macosx.c +++ b/dlls/secur32/schannel_macosx.c @@ -1213,6 +1213,12 @@ SECURITY_STATUS schan_imp_get_application_protocol(schan_imp_session session, return SEC_E_UNSUPPORTED_FUNCTION; }
+SECURITY_STATUS schan_imp_set_dtls_mtu(schan_imp_session session, unsigned int mtu) +{ + FIXME("no support for setting dtls mtu on this platform\n"); + return SEC_E_UNSUPPORTED_FUNCTION; +} + BOOL schan_imp_init(void) { TRACE("()\n"); diff --git a/dlls/secur32/secur32_priv.h b/dlls/secur32/secur32_priv.h index ce8d55d1eb6..ca0062056d6 100644 --- a/dlls/secur32/secur32_priv.h +++ b/dlls/secur32/secur32_priv.h @@ -253,5 +253,6 @@ extern void schan_imp_deinit(void) DECLSPEC_HIDDEN; extern void schan_imp_set_application_protocols(schan_imp_session, unsigned char *, unsigned int) DECLSPEC_HIDDEN; extern SECURITY_STATUS schan_imp_get_application_protocol(schan_imp_session, SecPkgContext_ApplicationProtocol *) DECLSPEC_HIDDEN; +extern SECURITY_STATUS schan_imp_set_dtls_mtu(schan_imp_session, unsigned int) DECLSPEC_HIDDEN;
#endif /* ndef __SECUR32_PRIV_H__ */