[WINHTTP] Sync with Wine Staging 2.2. CORE-12823

6053db9 winhttp: Fix handling of Accept headers.
c43dd19 winhttp: Add __WINE_ALLOC_SIZE attributes to heap_xxx() functions.
5b9beca winhttp: Fix some spec file entries.
542998e winhttp: Accept NULL buffer for size queries in WinHttpCreateUrl.
ec35394 winhttp: Handle EINTR from connect and poll.
613e239 winhttp: Use return value of sprintf() instead of calling strlen() and simplify code.

svn path=/trunk/; revision=74197
This commit is contained in:
Amine Khaldi 2017-03-19 17:04:32 +00:00
parent 557197382e
commit 1d323c7f36
7 changed files with 65 additions and 70 deletions

View file

@ -366,7 +366,7 @@ BOOL netconn_close( netconn_t *conn )
BOOL netconn_connect( netconn_t *conn, const struct sockaddr *sockaddr, unsigned int addr_len, int timeout ) BOOL netconn_connect( netconn_t *conn, const struct sockaddr *sockaddr, unsigned int addr_len, int timeout )
{ {
BOOL ret = FALSE; BOOL ret = FALSE;
int res = 0; int res;
ULONG state; ULONG state;
if (timeout > 0) if (timeout > 0)
@ -374,6 +374,10 @@ BOOL netconn_connect( netconn_t *conn, const struct sockaddr *sockaddr, unsigned
state = 1; state = 1;
ioctlsocket( conn->socket, FIONBIO, &state ); ioctlsocket( conn->socket, FIONBIO, &state );
} }
for (;;)
{
res = 0;
if (connect( conn->socket, sockaddr, addr_len ) < 0) if (connect( conn->socket, sockaddr, addr_len ) < 0)
{ {
res = sock_get_error( errno ); res = sock_get_error( errno );
@ -389,6 +393,9 @@ BOOL netconn_connect( netconn_t *conn, const struct sockaddr *sockaddr, unsigned
tv.tv_sec = 0; tv.tv_sec = 0;
tv.tv_usec = timeout * 1000; tv.tv_usec = timeout * 1000;
for (;;)
{
res = 0;
if (select( 0, NULL, &outfd, NULL, &tv ) > 0) if (select( 0, NULL, &outfd, NULL, &tv ) > 0)
#else #else
@ -396,15 +403,30 @@ BOOL netconn_connect( netconn_t *conn, const struct sockaddr *sockaddr, unsigned
pfd.fd = conn->socket; pfd.fd = conn->socket;
pfd.events = POLLOUT; pfd.events = POLLOUT;
for (;;)
{
res = 0;
if (poll( &pfd, 1, timeout ) > 0) if (poll( &pfd, 1, timeout ) > 0)
#endif #endif
{
ret = TRUE; ret = TRUE;
break;
}
else else
{
res = sock_get_error( errno ); res = sock_get_error( errno );
if (res != WSAEINTR) break;
} }
} }
}
if (res != WSAEINTR) break;
}
else else
{
ret = TRUE; ret = TRUE;
break;
}
}
if (timeout > 0) if (timeout > 0)
{ {
state = 0; state = 0;

View file

@ -392,7 +392,7 @@ static BOOL delete_header( request_t *request, DWORD index )
return TRUE; return TRUE;
} }
static BOOL process_header( request_t *request, LPCWSTR field, LPCWSTR value, DWORD flags, BOOL request_only ) BOOL process_header( request_t *request, LPCWSTR field, LPCWSTR value, DWORD flags, BOOL request_only )
{ {
int index; int index;
header_t hdr; header_t hdr;
@ -1119,15 +1119,10 @@ static BOOL send_request( request_t *request, LPCWSTR headers, DWORD headers_len
WCHAR *req = NULL; WCHAR *req = NULL;
char *req_ascii; char *req_ascii;
int bytes_sent; int bytes_sent;
DWORD len, i, flags; DWORD len;
clear_response_headers( request ); clear_response_headers( request );
flags = WINHTTP_ADDREQ_FLAG_ADD|WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA;
for (i = 0; i < request->num_accept_types; i++)
{
process_header( request, attr_accept, request->accept_types[i], flags, TRUE );
}
if (session->agent) if (session->agent)
process_header( request, attr_user_agent, session->agent, WINHTTP_ADDREQ_FLAG_ADD_IF_NEW, TRUE ); process_header( request, attr_user_agent, session->agent, WINHTTP_ADDREQ_FLAG_ADD_IF_NEW, TRUE );

View file

@ -577,8 +577,6 @@ static void request_destroy( object_header_t *hdr )
heap_free( request->headers[i].value ); heap_free( request->headers[i].value );
} }
heap_free( request->headers ); heap_free( request->headers );
for (i = 0; i < request->num_accept_types; i++) heap_free( request->accept_types[i] );
heap_free( request->accept_types );
for (i = 0; i < TARGET_MAX; i++) for (i = 0; i < TARGET_MAX; i++)
{ {
for (j = 0; j < SCHEME_MAX; j++) for (j = 0; j < SCHEME_MAX; j++)
@ -1001,32 +999,14 @@ static const object_vtbl_t request_vtbl =
static BOOL store_accept_types( request_t *request, const WCHAR **accept_types ) static BOOL store_accept_types( request_t *request, const WCHAR **accept_types )
{ {
static const WCHAR attr_accept[] = {'A','c','c','e','p','t',0};
static const DWORD flags = WINHTTP_ADDREQ_FLAG_ADD | WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA;
const WCHAR **types = accept_types; const WCHAR **types = accept_types;
DWORD i;
if (!types) return TRUE; if (!types) return TRUE;
while (*types) while (*types)
{ {
request->num_accept_types++; process_header( request, attr_accept, *types, flags, TRUE );
types++;
}
if (!request->num_accept_types) return TRUE;
if (!(request->accept_types = heap_alloc( request->num_accept_types * sizeof(WCHAR *))))
{
request->num_accept_types = 0;
return FALSE;
}
types = accept_types;
for (i = 0; i < request->num_accept_types; i++)
{
if (!(request->accept_types[i] = strdupW( *types )))
{
for ( ; i > 0; --i) heap_free( request->accept_types[i - 1] );
heap_free( request->accept_types );
request->accept_types = NULL;
request->num_accept_types = 0;
return FALSE;
}
types++; types++;
} }
return TRUE; return TRUE;

View file

@ -387,8 +387,7 @@ static BOOL calc_length( URL_COMPONENTS *uc, DWORD flags, LPDWORD len )
{ {
WCHAR port[sizeof("65535")]; WCHAR port[sizeof("65535")];
sprintfW( port, formatW, uc->nPort ); *len += sprintfW( port, formatW, uc->nPort );
*len += strlenW( port );
*len += 1; /* ":" */ *len += 1; /* ":" */
} }
if (uc->lpszUrlPath && *uc->lpszUrlPath != '/') *len += 1; /* '/' */ if (uc->lpszUrlPath && *uc->lpszUrlPath != '/') *len += 1; /* '/' */
@ -405,13 +404,12 @@ BOOL WINAPI WinHttpCreateUrl( LPURL_COMPONENTS uc, DWORD flags, LPWSTR url, LPDW
{ {
static const WCHAR formatW[] = {'%','u',0}; static const WCHAR formatW[] = {'%','u',0};
static const WCHAR twoslashW[] = {'/','/'}; static const WCHAR twoslashW[] = {'/','/'};
DWORD len; DWORD len;
INTERNET_SCHEME scheme; INTERNET_SCHEME scheme;
TRACE("%p, 0x%08x, %p, %p\n", uc, flags, url, required); TRACE("%p, 0x%08x, %p, %p\n", uc, flags, url, required);
if (!uc || uc->dwStructSize != sizeof(URL_COMPONENTS) || !required || !url) if (!uc || uc->dwStructSize != sizeof(URL_COMPONENTS) || !required)
{ {
set_last_error( ERROR_INVALID_PARAMETER ); set_last_error( ERROR_INVALID_PARAMETER );
return FALSE; return FALSE;
@ -425,6 +423,11 @@ BOOL WINAPI WinHttpCreateUrl( LPURL_COMPONENTS uc, DWORD flags, LPWSTR url, LPDW
set_last_error( ERROR_INSUFFICIENT_BUFFER ); set_last_error( ERROR_INSUFFICIENT_BUFFER );
return FALSE; return FALSE;
} }
if (!url)
{
set_last_error( ERROR_INVALID_PARAMETER );
return FALSE;
}
url[0] = 0; url[0] = 0;
*required = len; *required = len;
@ -484,15 +487,10 @@ BOOL WINAPI WinHttpCreateUrl( LPURL_COMPONENTS uc, DWORD flags, LPWSTR url, LPDW
if (!uses_default_port( scheme, uc->nPort )) if (!uses_default_port( scheme, uc->nPort ))
{ {
WCHAR port[sizeof("65535")];
sprintfW( port, formatW, uc->nPort );
*url = ':'; *url = ':';
url++; url++;
len = strlenW( port ); url += sprintfW( url, formatW, uc->nPort );
memcpy( url, port, len * sizeof(WCHAR) );
url += len;
} }
/* add slash between hostname and path if necessary */ /* add slash between hostname and path if necessary */

View file

@ -20,11 +20,11 @@
@ stdcall WinHttpQueryOption(ptr long ptr ptr) @ stdcall WinHttpQueryOption(ptr long ptr ptr)
@ stdcall WinHttpReadData(ptr ptr long ptr) @ stdcall WinHttpReadData(ptr ptr long ptr)
@ stdcall WinHttpReceiveResponse(ptr ptr) @ stdcall WinHttpReceiveResponse(ptr ptr)
@ stdcall WinHttpSendRequest(ptr wstr long ptr long long ptr) @ stdcall WinHttpSendRequest(ptr wstr long ptr long long long)
@ stdcall WinHttpSetCredentials(ptr long long wstr ptr ptr) @ stdcall WinHttpSetCredentials(ptr long long wstr ptr ptr)
@ stdcall WinHttpSetDefaultProxyConfiguration(ptr) @ stdcall WinHttpSetDefaultProxyConfiguration(ptr)
@ stdcall WinHttpSetOption(ptr long ptr long) @ stdcall WinHttpSetOption(ptr long ptr long)
@ stdcall WinHttpSetStatusCallback(ptr ptr long ptr) @ stdcall WinHttpSetStatusCallback(ptr ptr long long)
@ stdcall WinHttpSetTimeouts(ptr long long long long) @ stdcall WinHttpSetTimeouts(ptr long long long long)
@ stdcall WinHttpTimeFromSystemTime(ptr ptr) @ stdcall WinHttpTimeFromSystemTime(ptr ptr)
@ stdcall WinHttpTimeToSystemTime(wstr ptr) @ stdcall WinHttpTimeToSystemTime(wstr ptr)

View file

@ -222,8 +222,6 @@ typedef struct
char read_buf[8192]; /* buffer for already read but not returned data */ char read_buf[8192]; /* buffer for already read but not returned data */
header_t *headers; header_t *headers;
DWORD num_headers; DWORD num_headers;
WCHAR **accept_types;
DWORD num_accept_types;
struct authinfo *authinfo; struct authinfo *authinfo;
struct authinfo *proxy_authinfo; struct authinfo *proxy_authinfo;
HANDLE task_wait; HANDLE task_wait;
@ -318,25 +316,27 @@ void delete_domain( domain_t * ) DECLSPEC_HIDDEN;
BOOL set_server_for_hostname( connect_t *, LPCWSTR, INTERNET_PORT ) DECLSPEC_HIDDEN; BOOL set_server_for_hostname( connect_t *, LPCWSTR, INTERNET_PORT ) DECLSPEC_HIDDEN;
void destroy_authinfo( struct authinfo * ) DECLSPEC_HIDDEN; void destroy_authinfo( struct authinfo * ) DECLSPEC_HIDDEN;
BOOL process_header( request_t *request, LPCWSTR field, LPCWSTR value, DWORD flags, BOOL request_only ) DECLSPEC_HIDDEN;
extern HRESULT WinHttpRequest_create( void ** ) DECLSPEC_HIDDEN; extern HRESULT WinHttpRequest_create( void ** ) DECLSPEC_HIDDEN;
void release_typelib( void ) DECLSPEC_HIDDEN; void release_typelib( void ) DECLSPEC_HIDDEN;
static inline void *heap_alloc( SIZE_T size ) static inline void* __WINE_ALLOC_SIZE(1) heap_alloc( SIZE_T size )
{ {
return HeapAlloc( GetProcessHeap(), 0, size ); return HeapAlloc( GetProcessHeap(), 0, size );
} }
static inline void *heap_alloc_zero( SIZE_T size ) static inline void* __WINE_ALLOC_SIZE(1) heap_alloc_zero( SIZE_T size )
{ {
return HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, size ); return HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, size );
} }
static inline void *heap_realloc( LPVOID mem, SIZE_T size ) static inline void* __WINE_ALLOC_SIZE(2) heap_realloc( LPVOID mem, SIZE_T size )
{ {
return HeapReAlloc( GetProcessHeap(), 0, mem, size ); return HeapReAlloc( GetProcessHeap(), 0, mem, size );
} }
static inline void *heap_realloc_zero( LPVOID mem, SIZE_T size ) static inline void* __WINE_ALLOC_SIZE(2) heap_realloc_zero( LPVOID mem, SIZE_T size )
{ {
return HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, mem, size ); return HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, mem, size );
} }

View file

@ -200,7 +200,7 @@ reactos/dll/win32/windowscodecs # Synced to WineStaging-1.9.23
reactos/dll/win32/windowscodecsext # Synced to WineStaging-1.9.11 reactos/dll/win32/windowscodecsext # Synced to WineStaging-1.9.11
reactos/dll/win32/winemp3.acm # Synced to WineStaging-2.2 reactos/dll/win32/winemp3.acm # Synced to WineStaging-2.2
reactos/dll/win32/wing32 # Synced to WineStaging-1.9.11 reactos/dll/win32/wing32 # Synced to WineStaging-1.9.11
reactos/dll/win32/winhttp # Synced to WineStaging-1.9.23 reactos/dll/win32/winhttp # Synced to WineStaging-2.2
reactos/dll/win32/wininet # Synced to WineStaging-2.2 reactos/dll/win32/wininet # Synced to WineStaging-2.2
reactos/dll/win32/winmm # Forked at Wine-20050628 reactos/dll/win32/winmm # Forked at Wine-20050628
reactos/dll/win32/winmm/midimap # Forked at Wine-20050628 reactos/dll/win32/winmm/midimap # Forked at Wine-20050628