From: Hans Leidekker <hans@codeweavers.com> --- dlls/winhttp/session.c | 242 +++++++++++++++++++++++++++-------------- 1 file changed, 158 insertions(+), 84 deletions(-) diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c index 6348ec67b82..8595b4a18a8 100644 --- a/dlls/winhttp/session.c +++ b/dlls/winhttp/session.c @@ -175,22 +175,19 @@ static BOOL session_set_option( struct object_header *hdr, DWORD option, void *b { WINHTTP_PROXY_INFO *pi = buffer; - FIXME( "%lu %s %s\n", pi->dwAccessType, debugstr_w(pi->lpszProxy), debugstr_w(pi->lpszProxyBypass) ); + FIXME( "dwAccessType %lu lpszProxy %s lpszProxyBypass %s\n", pi->dwAccessType, debugstr_w(pi->lpszProxy), + debugstr_w(pi->lpszProxyBypass) ); return TRUE; } case WINHTTP_OPTION_REDIRECT_POLICY: { - DWORD policy; - - if (buflen != sizeof(policy)) + if (buflen != sizeof(hdr->redirect_policy)) { SetLastError( ERROR_INSUFFICIENT_BUFFER ); return FALSE; } - - policy = *(DWORD *)buffer; - TRACE( "%#lx\n", policy ); - hdr->redirect_policy = policy; + hdr->redirect_policy = *(DWORD *)buffer; + TRACE( "redirect_policy %#lx\n", hdr->redirect_policy ); return TRUE; } case WINHTTP_OPTION_SECURE_PROTOCOLS: @@ -203,7 +200,7 @@ static BOOL session_set_option( struct object_header *hdr, DWORD option, void *b EnterCriticalSection( &session->cs ); session->secure_protocols = *(DWORD *)buffer; LeaveCriticalSection( &session->cs ); - TRACE( "%#lx\n", session->secure_protocols ); + TRACE( "secure_protocols %#lx\n", session->secure_protocols ); return TRUE; } case WINHTTP_OPTION_DISABLE_FEATURE: @@ -211,70 +208,113 @@ static BOOL session_set_option( struct object_header *hdr, DWORD option, void *b return FALSE; case WINHTTP_OPTION_RESOLVE_TIMEOUT: + if (buflen != sizeof(session->resolve_timeout)) + { + SetLastError( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } session->resolve_timeout = *(DWORD *)buffer; + TRACE( "resolve_timeout %u\n", session->resolve_timeout ); return TRUE; case WINHTTP_OPTION_CONNECT_TIMEOUT: + if (buflen != sizeof(session->connect_timeout)) + { + SetLastError( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } session->connect_timeout = *(DWORD *)buffer; + TRACE( "connect_timeout %u\n", session->connect_timeout ); return TRUE; case WINHTTP_OPTION_SEND_TIMEOUT: + if (buflen != sizeof(session->send_timeout)) + { + SetLastError( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } session->send_timeout = *(DWORD *)buffer; + TRACE( "send_timeout %u\n", session->send_timeout ); return TRUE; case WINHTTP_OPTION_RECEIVE_TIMEOUT: + if (buflen != sizeof(session->receive_timeout)) + { + SetLastError( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } session->receive_timeout = *(DWORD *)buffer; + TRACE( "receive_timeout %u\n", session->receive_timeout ); return TRUE; case WINHTTP_OPTION_RECEIVE_RESPONSE_TIMEOUT: + if (buflen != sizeof(session->receive_response_timeout)) + { + SetLastError( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } session->receive_response_timeout = *(DWORD *)buffer; + TRACE( "receive_response_timeout %u\n", session->receive_response_timeout ); return TRUE; case WINHTTP_OPTION_CONFIGURE_PASSPORT_AUTH: + if (buflen != sizeof(session->passport_flags)) + { + SetLastError( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } session->passport_flags = *(DWORD *)buffer; + TRACE( "passport_flags %#lx\n", session->passport_flags ); return TRUE; case WINHTTP_OPTION_UNLOAD_NOTIFY_EVENT: - TRACE("WINHTTP_OPTION_UNLOAD_NOTIFY_EVENT: %p\n", *(HANDLE *)buffer); + if (buflen != sizeof(session->unload_event)) + { + SetLastError( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } session->unload_event = *(HANDLE *)buffer; + TRACE( "unload_event %p\n", session->unload_event ); return TRUE; case WINHTTP_OPTION_MAX_CONNS_PER_SERVER: + if (buflen != sizeof(DWORD)) + { + SetLastError( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } FIXME( "WINHTTP_OPTION_MAX_CONNS_PER_SERVER: %lu\n", *(DWORD *)buffer ); return TRUE; case WINHTTP_OPTION_MAX_CONNS_PER_1_0_SERVER: + if (buflen != sizeof(DWORD)) + { + SetLastError( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } FIXME( "WINHTTP_OPTION_MAX_CONNS_PER_1_0_SERVER: %lu\n", *(DWORD *)buffer ); return TRUE; case WINHTTP_OPTION_WEB_SOCKET_RECEIVE_BUFFER_SIZE: { - DWORD buffer_size; - - if (buflen != sizeof(buffer_size)) + if (buflen != sizeof(session->websocket_receive_buffer_size)) { SetLastError( ERROR_INSUFFICIENT_BUFFER ); return FALSE; } - - buffer_size = *(DWORD *)buffer; - TRACE( "%#lx\n", buffer_size ); - session->websocket_receive_buffer_size = buffer_size; + session->websocket_receive_buffer_size = *(DWORD *)buffer; + TRACE( "websocket_receive_buffer_size %u\n", session->websocket_receive_buffer_size ); return TRUE; } case WINHTTP_OPTION_WEB_SOCKET_SEND_BUFFER_SIZE: { - DWORD buffer_size; - - if (buflen != sizeof(buffer_size)) + if (buflen != sizeof(session->websocket_send_buffer_size)) { SetLastError( ERROR_INSUFFICIENT_BUFFER ); return FALSE; } - - buffer_size = *(DWORD *)buffer; - TRACE( "%#lx\n", buffer_size ); - session->websocket_send_buffer_size = buffer_size; + session->websocket_send_buffer_size = *(DWORD *)buffer; + TRACE( "websocket_send_buffer_size %#x\n", session->websocket_send_buffer_size ); return TRUE; } case WINHTTP_OPTION_DECOMPRESSION: @@ -292,7 +332,7 @@ static BOOL session_set_option( struct object_header *hdr, DWORD option, void *b FIXME( "unknown compression types %lx\n", decompression ); return FALSE; } - TRACE( "%#lx\n", decompression ); + TRACE( "decompression %#lx\n", decompression ); session->hdr.decompression = decompression; return TRUE; } @@ -1023,52 +1063,46 @@ static BOOL request_set_option( struct object_header *hdr, DWORD option, void *b { WINHTTP_PROXY_INFO *pi = buffer; - FIXME( "%lu %s %s\n", pi->dwAccessType, debugstr_w(pi->lpszProxy), debugstr_w(pi->lpszProxyBypass) ); + if (buflen != sizeof(*pi)) + { + SetLastError( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } + FIXME( "dwAccessType %lu lpszProxy %s lpszProxyBypass %s\n", pi->dwAccessType, debugstr_w(pi->lpszProxy), + debugstr_w(pi->lpszProxyBypass) ); return TRUE; } case WINHTTP_OPTION_DISABLE_FEATURE: { - DWORD disable; - - if (buflen != sizeof(DWORD)) + if (buflen != sizeof(hdr->disable_flags)) { SetLastError( ERROR_INSUFFICIENT_BUFFER ); return FALSE; } - - disable = *(DWORD *)buffer; - TRACE( "%#lx\n", disable ); - hdr->disable_flags |= disable; + hdr->disable_flags |= *(DWORD *)buffer; + TRACE( "disable_flags %#lx\n", hdr->disable_flags ); return TRUE; } case WINHTTP_OPTION_AUTOLOGON_POLICY: { - DWORD policy; - - if (buflen != sizeof(DWORD)) + if (buflen != sizeof(hdr->logon_policy)) { SetLastError( ERROR_INSUFFICIENT_BUFFER ); return FALSE; } - - policy = *(DWORD *)buffer; - TRACE( "%#lx\n", policy ); - hdr->logon_policy = policy; + hdr->logon_policy = *(DWORD *)buffer; + TRACE( "logon_policy %#lx\n", hdr->logon_policy ); return TRUE; } case WINHTTP_OPTION_REDIRECT_POLICY: { - DWORD policy; - - if (buflen != sizeof(DWORD)) + if (buflen != sizeof(hdr->redirect_policy)) { SetLastError( ERROR_INSUFFICIENT_BUFFER ); return FALSE; } - - policy = *(DWORD *)buffer; - TRACE( "%#lx\n", policy ); - hdr->redirect_policy = policy; + hdr->redirect_policy = *(DWORD *)buffer; + TRACE( "redirect_policy %#lx\n", hdr->redirect_policy ); return TRUE; } case WINHTTP_OPTION_SECURITY_FLAGS: @@ -1079,39 +1113,69 @@ static BOOL request_set_option( struct object_header *hdr, DWORD option, void *b SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE; - if (buflen < sizeof(DWORD)) + if (buflen < sizeof(flags)) { SetLastError( ERROR_INSUFFICIENT_BUFFER ); return FALSE; } flags = *(DWORD *)buffer; - TRACE( "%#lx\n", flags ); if (flags && (flags & ~accepted)) { SetLastError( ERROR_INVALID_PARAMETER ); return FALSE; } request->security_flags = flags; + TRACE( "security_flags %#lx\n", flags ); return TRUE; } case WINHTTP_OPTION_RESOLVE_TIMEOUT: + if (buflen != sizeof(request->resolve_timeout)) + { + SetLastError( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } request->resolve_timeout = *(DWORD *)buffer; + TRACE( "resolve_timeout %u\n", request->resolve_timeout ); return TRUE; case WINHTTP_OPTION_CONNECT_TIMEOUT: + if (buflen != sizeof(request->connect_timeout)) + { + SetLastError( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } request->connect_timeout = *(DWORD *)buffer; + TRACE( "connect_timeout %u\n", request->connect_timeout ); return TRUE; case WINHTTP_OPTION_SEND_TIMEOUT: + if (buflen != sizeof(request->send_timeout)) + { + SetLastError( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } request->send_timeout = *(DWORD *)buffer; + TRACE( "send_timeout %u\n", request->send_timeout ); return TRUE; case WINHTTP_OPTION_RECEIVE_TIMEOUT: + if (buflen != sizeof(request->receive_timeout)) + { + SetLastError( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } request->receive_timeout = *(DWORD *)buffer; + TRACE( "receive_timeout %u\n", request->receive_timeout ); return TRUE; case WINHTTP_OPTION_RECEIVE_RESPONSE_TIMEOUT: + if (buflen != sizeof(request->receive_response_timeout)) + { + SetLastError( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } request->receive_response_timeout = *(DWORD *)buffer; + TRACE( "receive_response_timeout %u\n", request->receive_response_timeout ); return TRUE; case WINHTTP_OPTION_USERNAME: @@ -1120,6 +1184,7 @@ static BOOL request_set_option( struct object_header *hdr, DWORD option, void *b free( connect->username ); if (!(connect->username = buffer_to_str( buffer, buflen ))) return FALSE; + TRACE( "username %s\n", debugstr_w(connect->username) ); return TRUE; } case WINHTTP_OPTION_PASSWORD: @@ -1136,6 +1201,7 @@ static BOOL request_set_option( struct object_header *hdr, DWORD option, void *b free( session->proxy_username ); if (!(session->proxy_username = buffer_to_str( buffer, buflen ))) return FALSE; + TRACE( "proxy_username %s\n", debugstr_w(session->proxy_username) ); return TRUE; } case WINHTTP_OPTION_PROXY_PASSWORD: @@ -1171,19 +1237,19 @@ static BOOL request_set_option( struct object_header *hdr, DWORD option, void *b SetLastError( ERROR_INVALID_PARAMETER ); return FALSE; } - if (request->cred_handle_initialized) { FreeCredentialsHandle( &request->cred_handle ); request->cred_handle_initialized = FALSE; } - + TRACE( "client_cert %p\n", request->client_cert ); return TRUE; } case WINHTTP_OPTION_ENABLE_FEATURE: - if(buflen == sizeof( DWORD ) && *(DWORD *)buffer == WINHTTP_ENABLE_SSL_REVOCATION) + if (buflen == sizeof( DWORD ) && *(DWORD *)buffer == WINHTTP_ENABLE_SSL_REVOCATION) { request->check_revocation = TRUE; + TRACE( "SSL revocation enabled\n" ); SetLastError( NO_ERROR ); return TRUE; } @@ -1195,68 +1261,77 @@ static BOOL request_set_option( struct object_header *hdr, DWORD option, void *b case WINHTTP_OPTION_UPGRADE_TO_WEB_SOCKET: request->flags |= REQUEST_FLAG_WEBSOCKET_UPGRADE; + TRACE( "enabled upgrade to web socket\n" ); return TRUE; case WINHTTP_OPTION_CONNECT_RETRIES: - FIXME("WINHTTP_OPTION_CONNECT_RETRIES\n"); + if (buflen != sizeof(DWORD)) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return FALSE; + } + FIXME( "WINHTTP_OPTION_CONNECT_RETRIES %lu\n", *(DWORD *)buffer ); return TRUE; case WINHTTP_OPTION_MAX_HTTP_AUTOMATIC_REDIRECTS: - if (buflen == sizeof(DWORD)) + if (buflen != sizeof(request->max_redirects)) { - request->max_redirects = *(DWORD *)buffer; - SetLastError(NO_ERROR); - return TRUE; + SetLastError( ERROR_INVALID_PARAMETER ); + return FALSE; } - - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; + request->max_redirects = *(DWORD *)buffer; + TRACE( "max_redirects %lu\n", request->max_redirects ); + SetLastError(NO_ERROR); + return TRUE; case WINHTTP_OPTION_MAX_RESPONSE_HEADER_SIZE: - FIXME("WINHTTP_OPTION_MAX_RESPONSE_HEADER_SIZE\n"); + if (buflen != sizeof(DWORD)) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return FALSE; + } + FIXME("WINHTTP_OPTION_MAX_RESPONSE_HEADER_SIZE %#lx\n", *(DWORD *)buffer ); return TRUE; case WINHTTP_OPTION_MAX_RESPONSE_DRAIN_SIZE: - FIXME("WINHTTP_OPTION_MAX_RESPONSE_DRAIN_SIZE\n"); + if (buflen != sizeof(DWORD)) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return FALSE; + } + FIXME("WINHTTP_OPTION_MAX_RESPONSE_DRAIN_SIZE %#lx\n", *(DWORD *)buffer ); return TRUE; case WINHTTP_OPTION_ENABLE_HTTP_PROTOCOL: - if (buflen == sizeof(DWORD)) + if (buflen != sizeof(DWORD)) { - FIXME( "WINHTTP_OPTION_ENABLE_HTTP_PROTOCOL %#lx\n", *(DWORD *)buffer ); - return TRUE; + SetLastError( ERROR_INVALID_PARAMETER ); + return FALSE; } - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; + FIXME( "WINHTTP_OPTION_ENABLE_HTTP_PROTOCOL %#lx\n", *(DWORD *)buffer ); + return TRUE; case WINHTTP_OPTION_WEB_SOCKET_RECEIVE_BUFFER_SIZE: { - DWORD buffer_size; - - if (buflen != sizeof(buffer_size)) + if (buflen != sizeof(request->websocket_receive_buffer_size)) { SetLastError( ERROR_INSUFFICIENT_BUFFER ); return FALSE; } - - buffer_size = *(DWORD *)buffer; - WARN( "Setting websocket receive buffer size currently has not effct, size %lu\n", buffer_size ); - request->websocket_receive_buffer_size = buffer_size; + WARN( "currently has no effect\n" ); + request->websocket_receive_buffer_size = *(DWORD *)buffer; + TRACE( "websocket_receive_buffer_size %u\n", request->websocket_set_send_buffer_size); return TRUE; } case WINHTTP_OPTION_WEB_SOCKET_SEND_BUFFER_SIZE: { - DWORD buffer_size; - - if (buflen != sizeof(buffer_size)) + if (buflen != sizeof(request->websocket_set_send_buffer_size)) { SetLastError( ERROR_INSUFFICIENT_BUFFER ); return FALSE; } - - buffer_size = *(DWORD *)buffer; - request->websocket_set_send_buffer_size = buffer_size; - TRACE( "Websocket send buffer size %lu.\n", buffer_size); + request->websocket_set_send_buffer_size = *(DWORD *)buffer; + TRACE( "websocket_set_send_buffer_size %u\n", request->websocket_set_send_buffer_size); return TRUE; } case WINHTTP_OPTION_DECOMPRESSION: @@ -1274,7 +1349,7 @@ static BOOL request_set_option( struct object_header *hdr, DWORD option, void *b FIXME( "unknown compression types %lx\n", decompression ); return FALSE; } - TRACE( "%#lx\n", decompression ); + TRACE( "decompression %#lx\n", decompression ); request->hdr.decompression = decompression; return TRUE; } @@ -1502,12 +1577,11 @@ static BOOL set_option( struct object_header *hdr, DWORD option, void *buffer, D { case WINHTTP_OPTION_CONTEXT_VALUE: { - if (buflen != sizeof(DWORD_PTR)) + if (buflen != sizeof(hdr->context)) { SetLastError( ERROR_INSUFFICIENT_BUFFER ); return FALSE; } - hdr->context = *(DWORD_PTR *)buffer; return TRUE; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10426