Author: cgutman Date: Sat Oct 9 20:08:18 2010 New Revision: 49081
URL: http://svn.reactos.org/svn/reactos?rev=49081&view=rev Log: [WININET] - Sync wininet to WINE 1.3.4 - Regenerate wininet_ros.diff so that it actually applies against current WINE head
Modified: trunk/reactos/dll/win32/wininet/cookie.c trunk/reactos/dll/win32/wininet/http.c trunk/reactos/dll/win32/wininet/internet.c trunk/reactos/dll/win32/wininet/internet.h trunk/reactos/dll/win32/wininet/netconnection.c trunk/reactos/dll/win32/wininet/urlcache.c trunk/reactos/dll/win32/wininet/wininet_ros.diff
Modified: trunk/reactos/dll/win32/wininet/cookie.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/wininet/cookie.c?... ============================================================================== --- trunk/reactos/dll/win32/wininet/cookie.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/wininet/cookie.c [iso-8859-1] Sat Oct 9 20:08:18 2010 @@ -431,7 +431,7 @@ value = data = heap_strdupW(cookie_data); if (!data) { - ERR("could not allocate %zu bytes for the cookie data buffer\n", (strlenW(cookie_data) + 1) * sizeof(WCHAR)); + ERR("could not allocate the cookie data buffer\n"); return FALSE; }
@@ -457,7 +457,7 @@ if (value == NULL) { HeapFree(GetProcessHeap(), 0, data); - ERR("could not allocate %zu bytes for the cookie value buffer\n", (ptr - data) * sizeof(WCHAR)); + ERR("could not allocate the cookie value buffer\n"); return FALSE; } strcpyW(value, data);
Modified: trunk/reactos/dll/win32/wininet/http.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/wininet/http.c?re... ============================================================================== --- trunk/reactos/dll/win32/wininet/http.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/wininet/http.c [iso-8859-1] Sat Oct 9 20:08:18 2010 @@ -181,7 +181,7 @@ BOOL end_of_data; };
-typedef struct _authorizationData +typedef struct _basicAuthorizationData { struct list entry;
@@ -189,9 +189,24 @@ LPWSTR lpszwRealm; LPSTR lpszAuthorization; UINT AuthorizationLen; +} basicAuthorizationData; + +typedef struct _authorizationData +{ + struct list entry; + + LPWSTR host; + LPWSTR scheme; + LPWSTR domain; + UINT domain_len; + LPWSTR user; + UINT user_len; + LPWSTR password; + UINT password_len; } authorizationData;
static struct list basicAuthorizationCache = LIST_INIT(basicAuthorizationCache); +static struct list authorizationCache = LIST_INIT(authorizationCache);
static CRITICAL_SECTION authcache_cs; static CRITICAL_SECTION_DEBUG critsect_debug = @@ -572,13 +587,13 @@
static UINT retrieve_cached_basic_authorization(LPWSTR host, LPWSTR realm, LPSTR *auth_data) { - authorizationData *ad; + basicAuthorizationData *ad; UINT rc = 0;
TRACE("Looking for authorization for %s:%s\n",debugstr_w(host),debugstr_w(realm));
EnterCriticalSection(&authcache_cs); - LIST_FOR_EACH_ENTRY(ad, &basicAuthorizationCache, authorizationData, entry) + LIST_FOR_EACH_ENTRY(ad, &basicAuthorizationCache, basicAuthorizationData, entry) { if (!strcmpiW(host,ad->lpszwHost) && !strcmpW(realm,ad->lpszwRealm)) { @@ -596,14 +611,14 @@ static void cache_basic_authorization(LPWSTR host, LPWSTR realm, LPSTR auth_data, UINT auth_data_len) { struct list *cursor; - authorizationData* ad = NULL; + basicAuthorizationData* ad = NULL;
TRACE("caching authorization for %s:%s = %s\n",debugstr_w(host),debugstr_w(realm),debugstr_an(auth_data,auth_data_len));
EnterCriticalSection(&authcache_cs); LIST_FOR_EACH(cursor, &basicAuthorizationCache) { - authorizationData *check = LIST_ENTRY(cursor,authorizationData,entry); + basicAuthorizationData *check = LIST_ENTRY(cursor,basicAuthorizationData,entry); if (!strcmpiW(host,check->lpszwHost) && !strcmpW(realm,check->lpszwRealm)) { ad = check; @@ -621,7 +636,7 @@ } else { - ad = HeapAlloc(GetProcessHeap(),0,sizeof(authorizationData)); + ad = HeapAlloc(GetProcessHeap(),0,sizeof(basicAuthorizationData)); ad->lpszwHost = heap_strdupW(host); ad->lpszwRealm = heap_strdupW(realm); ad->lpszAuthorization = HeapAlloc(GetProcessHeap(),0,auth_data_len); @@ -633,6 +648,95 @@ LeaveCriticalSection(&authcache_cs); }
+static BOOL retrieve_cached_authorization(LPWSTR host, LPWSTR scheme, + SEC_WINNT_AUTH_IDENTITY_W *nt_auth_identity) +{ + authorizationData *ad; + + TRACE("Looking for authorization for %s:%s\n", debugstr_w(host), debugstr_w(scheme)); + + EnterCriticalSection(&authcache_cs); + LIST_FOR_EACH_ENTRY(ad, &authorizationCache, authorizationData, entry) { + if(!strcmpiW(host, ad->host) && !strcmpiW(scheme, ad->scheme)) { + TRACE("Authorization found in cache\n"); + + nt_auth_identity->User = heap_strdupW(ad->user); + nt_auth_identity->Password = heap_strdupW(ad->password); + nt_auth_identity->Domain = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*ad->domain_len); + if(!nt_auth_identity->User || !nt_auth_identity->Password || + (!nt_auth_identity->Domain && ad->domain_len)) { + HeapFree(GetProcessHeap(), 0, nt_auth_identity->User); + HeapFree(GetProcessHeap(), 0, nt_auth_identity->Password); + HeapFree(GetProcessHeap(), 0, nt_auth_identity->Domain); + break; + } + + nt_auth_identity->Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE; + nt_auth_identity->UserLength = ad->user_len; + nt_auth_identity->PasswordLength = ad->password_len; + memcpy(nt_auth_identity->Domain, ad->domain, sizeof(WCHAR)*ad->domain_len); + nt_auth_identity->DomainLength = ad->domain_len; + LeaveCriticalSection(&authcache_cs); + return TRUE; + } + } + LeaveCriticalSection(&authcache_cs); + + return FALSE; +} + +static void cache_authorization(LPWSTR host, LPWSTR scheme, + SEC_WINNT_AUTH_IDENTITY_W *nt_auth_identity) +{ + authorizationData *ad; + BOOL found = FALSE; + + TRACE("Caching authorization for %s:%s\n", debugstr_w(host), debugstr_w(scheme)); + + EnterCriticalSection(&authcache_cs); + LIST_FOR_EACH_ENTRY(ad, &authorizationCache, authorizationData, entry) + if(!strcmpiW(host, ad->host) && !strcmpiW(scheme, ad->scheme)) { + found = TRUE; + break; + } + + if(found) { + HeapFree(GetProcessHeap(), 0, ad->user); + HeapFree(GetProcessHeap(), 0, ad->password); + HeapFree(GetProcessHeap(), 0, ad->domain); + } else { + ad = HeapAlloc(GetProcessHeap(), 0, sizeof(authorizationData)); + if(!ad) { + LeaveCriticalSection(&authcache_cs); + return; + } + + ad->host = heap_strdupW(host); + ad->scheme = heap_strdupW(scheme); + list_add_head(&authorizationCache, &ad->entry); + } + + ad->user = heap_strndupW(nt_auth_identity->User, nt_auth_identity->UserLength); + ad->password = heap_strndupW(nt_auth_identity->Password, nt_auth_identity->PasswordLength); + ad->domain = heap_strndupW(nt_auth_identity->Domain, nt_auth_identity->DomainLength); + ad->user_len = nt_auth_identity->UserLength; + ad->password_len = nt_auth_identity->PasswordLength; + ad->domain_len = nt_auth_identity->DomainLength; + + if(!ad->host || !ad->scheme || !ad->user || !ad->password + || (nt_auth_identity->Domain && !ad->domain)) { + HeapFree(GetProcessHeap(), 0, ad->host); + HeapFree(GetProcessHeap(), 0, ad->scheme); + HeapFree(GetProcessHeap(), 0, ad->user); + HeapFree(GetProcessHeap(), 0, ad->password); + HeapFree(GetProcessHeap(), 0, ad->domain); + list_remove(&ad->entry); + HeapFree(GetProcessHeap(), 0, ad); + } + + LeaveCriticalSection(&authcache_cs); +} + static BOOL HTTP_DoAuthorization( http_request_t *lpwhr, LPCWSTR pszAuthValue, struct HttpAuthInfo **ppAuthInfo, LPWSTR domain_and_username, LPWSTR password, @@ -707,7 +811,11 @@ nt_auth_identity.DomainLength = domain ? user - domain - 1 : 0; nt_auth_identity.Password = password; nt_auth_identity.PasswordLength = strlenW(nt_auth_identity.Password); + + cache_authorization(host, pAuthInfo->scheme, &nt_auth_identity); } + else if(retrieve_cached_authorization(host, pAuthInfo->scheme, &nt_auth_identity)) + pAuthData = &nt_auth_identity; else /* use default credentials */ pAuthData = NULL; @@ -717,6 +825,13 @@ pAuthData, NULL, NULL, &pAuthInfo->cred, &exp); + + if(pAuthData && !domain_and_username) { + HeapFree(GetProcessHeap(), 0, nt_auth_identity.User); + HeapFree(GetProcessHeap(), 0, nt_auth_identity.Domain); + HeapFree(GetProcessHeap(), 0, nt_auth_identity.Password); + } + if (sec_status == SEC_E_OK) { PSecPkgInfoW sec_pkg_info; @@ -1426,6 +1541,20 @@ return ERROR_SUCCESS; }
+static BOOL HTTP_GetRequestURL(http_request_t *req, LPWSTR buf) +{ + LPHTTPHEADERW host_header; + + static const WCHAR formatW[] = {'h','t','t','p',':','/','/','%','s','%','s',0}; + + host_header = HTTP_GetHeader(req, hostW); + if(!host_header) + return FALSE; + + sprintfW(buf, formatW, host_header->lpszValue, req->lpszPath); /* FIXME */ + return TRUE; +} +
/*********************************************************************** * HTTPREQ_Destroy (internal) @@ -1440,8 +1569,18 @@
TRACE("\n");
- if(lpwhr->hCacheFile) + if(lpwhr->hCacheFile) { + WCHAR url[INTERNET_MAX_URL_LENGTH]; + FILETIME ft; + CloseHandle(lpwhr->hCacheFile); + + memset(&ft, 0, sizeof(FILETIME)); + if(HTTP_GetRequestURL(lpwhr, url)) { + CommitUrlCacheEntryW(url, lpwhr->lpszCacheFile, ft, ft, + NORMAL_CACHE_ENTRY, NULL, 0, NULL, 0); + } + }
HeapFree(GetProcessHeap(), 0, lpwhr->lpszCacheFile);
@@ -1491,20 +1630,6 @@
INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, INTERNET_STATUS_CONNECTION_CLOSED, 0, 0); -} - -static BOOL HTTP_GetRequestURL(http_request_t *req, LPWSTR buf) -{ - LPHTTPHEADERW host_header; - - static const WCHAR formatW[] = {'h','t','t','p',':','/','/','%','s','%','s',0}; - - host_header = HTTP_GetHeader(req, hostW); - if(!host_header) - return FALSE; - - sprintfW(buf, formatW, host_header->lpszValue, req->lpszPath); /* FIXME */ - return TRUE; }
static BOOL HTTP_KeepAlive(http_request_t *lpwhr) @@ -1567,18 +1692,25 @@
case INTERNET_OPTION_SECURITY_FLAGS: { - http_session_t *lpwhs; - lpwhs = req->lpHttpSession; + DWORD flags; + int bits;
if (*size < sizeof(ULONG)) return ERROR_INSUFFICIENT_BUFFER;
*size = sizeof(DWORD); - if (lpwhs->hdr.dwFlags & INTERNET_FLAG_SECURE) - *(DWORD*)buffer = SECURITY_FLAG_SECURE; + flags = 0; + if (req->hdr.dwFlags & INTERNET_FLAG_SECURE) + flags |= SECURITY_FLAG_SECURE; + flags |= req->netConnection.security_flags; + bits = NETCON_GetCipherStrength(&req->netConnection); + if (bits >= 128) + flags |= SECURITY_FLAG_STRENGTH_STRONG; + else if (bits >= 56) + flags |= SECURITY_FLAG_STRENGTH_MEDIUM; else - *(DWORD*)buffer = 0; - FIXME("Semi-STUB INTERNET_OPTION_SECURITY_FLAGS: %x\n",*(DWORD*)buffer); + flags |= SECURITY_FLAG_STRENGTH_WEAK; + *(DWORD *)buffer = flags; return ERROR_SUCCESS; }
@@ -1696,60 +1828,34 @@ case INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT: { PCCERT_CONTEXT context;
- if(*size < sizeof(INTERNET_CERTIFICATE_INFOW)) { - *size = sizeof(INTERNET_CERTIFICATE_INFOW); + if(*size < sizeof(INTERNET_CERTIFICATE_INFOA)) { + *size = sizeof(INTERNET_CERTIFICATE_INFOA); return ERROR_INSUFFICIENT_BUFFER; }
context = (PCCERT_CONTEXT)NETCON_GetCert(&(req->netConnection)); if(context) { - INTERNET_CERTIFICATE_INFOW *info = (INTERNET_CERTIFICATE_INFOW*)buffer; + INTERNET_CERTIFICATE_INFOA *info = (INTERNET_CERTIFICATE_INFOA*)buffer; DWORD len;
memset(info, 0, sizeof(INTERNET_CERTIFICATE_INFOW)); info->ftExpiry = context->pCertInfo->NotAfter; info->ftStart = context->pCertInfo->NotBefore; - if(unicode) { - len = CertNameToStrW(context->dwCertEncodingType, - &context->pCertInfo->Subject, CERT_SIMPLE_NAME_STR, NULL, 0); - info->lpszSubjectInfo = LocalAlloc(0, len*sizeof(WCHAR)); - if(info->lpszSubjectInfo) - CertNameToStrW(context->dwCertEncodingType, - &context->pCertInfo->Subject, CERT_SIMPLE_NAME_STR, - info->lpszSubjectInfo, len); - len = CertNameToStrW(context->dwCertEncodingType, - &context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR, NULL, 0); - info->lpszIssuerInfo = LocalAlloc(0, len*sizeof(WCHAR)); - if (info->lpszIssuerInfo) - CertNameToStrW(context->dwCertEncodingType, - &context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR, - info->lpszIssuerInfo, len); - }else { - INTERNET_CERTIFICATE_INFOA *infoA = (INTERNET_CERTIFICATE_INFOA*)info; - - len = CertNameToStrA(context->dwCertEncodingType, - &context->pCertInfo->Subject, CERT_SIMPLE_NAME_STR, NULL, 0); - infoA->lpszSubjectInfo = LocalAlloc(0, len); - if(infoA->lpszSubjectInfo) - CertNameToStrA(context->dwCertEncodingType, - &context->pCertInfo->Subject, CERT_SIMPLE_NAME_STR, - infoA->lpszSubjectInfo, len); - len = CertNameToStrA(context->dwCertEncodingType, - &context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR, NULL, 0); - infoA->lpszIssuerInfo = LocalAlloc(0, len); - if(infoA->lpszIssuerInfo) - CertNameToStrA(context->dwCertEncodingType, - &context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR, - infoA->lpszIssuerInfo, len); - } - - /* - * Contrary to MSDN, these do not appear to be set. - * lpszProtocolName - * lpszSignatureAlgName - * lpszEncryptionAlgName - * dwKeySize - */ + len = CertNameToStrA(context->dwCertEncodingType, + &context->pCertInfo->Subject, CERT_SIMPLE_NAME_STR, NULL, 0); + info->lpszSubjectInfo = LocalAlloc(0, len); + if(info->lpszSubjectInfo) + CertNameToStrA(context->dwCertEncodingType, + &context->pCertInfo->Subject, CERT_SIMPLE_NAME_STR, + info->lpszSubjectInfo, len); + len = CertNameToStrA(context->dwCertEncodingType, + &context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR, NULL, 0); + info->lpszIssuerInfo = LocalAlloc(0, len); + if(info->lpszIssuerInfo) + CertNameToStrA(context->dwCertEncodingType, + &context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR, + info->lpszIssuerInfo, len); + info->dwKeySize = NETCON_GetCipherStrength(&req->netConnection); CertFreeCertificateContext(context); return ERROR_SUCCESS; } @@ -1764,6 +1870,17 @@ http_request_t *req = (http_request_t*)hdr;
switch(option) { + case INTERNET_OPTION_SECURITY_FLAGS: + { + DWORD flags; + + if (!buffer || size != sizeof(DWORD)) + return ERROR_INVALID_PARAMETER; + flags = *(DWORD *)buffer; + TRACE("%08x\n", flags); + req->netConnection.security_flags = flags; + return ERROR_SUCCESS; + } case INTERNET_OPTION_SEND_TIMEOUT: case INTERNET_OPTION_RECEIVE_TIMEOUT: TRACE("INTERNET_OPTION_SEND/RECEIVE_TIMEOUT\n"); @@ -1969,6 +2086,9 @@ if(!sync || refill_buffer(req) != ERROR_SUCCESS) break; } + + if(req->dwContentRead == req->dwContentLength) + break;
buf_avail = req->dwContentLength == ~0 ? req->read_size : min(req->read_size, req->dwContentLength-req->dwContentRead);
@@ -2125,7 +2245,18 @@ static DWORD HTTPREQ_ReadFile(object_header_t *hdr, void *buffer, DWORD size, DWORD *read) { http_request_t *req = (http_request_t*)hdr; - return HTTPREQ_Read(req, buffer, size, read, TRUE); + DWORD res; + + EnterCriticalSection( &req->read_section ); + if(hdr->dwError == INTERNET_HANDLE_IN_USE) + hdr->dwError = ERROR_INTERNET_INTERNAL_ERROR; + + res = HTTPREQ_Read(req, buffer, size, read, TRUE); + if(res == ERROR_SUCCESS) + res = hdr->dwError; + LeaveCriticalSection( &req->read_section ); + + return res; }
static void HTTPREQ_AsyncReadFileExAProc(WORKREQUEST *workRequest) @@ -2152,7 +2283,7 @@ DWORD flags, DWORD_PTR context) { http_request_t *req = (http_request_t*)hdr; - DWORD res; + DWORD res, size, read, error = ERROR_SUCCESS;
if (flags & ~(IRF_ASYNC|IRF_NO_WAIT)) FIXME("these dwFlags aren't implemented: 0x%x\n", flags & ~(IRF_ASYNC|IRF_NO_WAIT)); @@ -2162,7 +2293,7 @@
INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_RECEIVING_RESPONSE, NULL, 0);
- if ((hdr->dwFlags & INTERNET_FLAG_ASYNC) && !get_avail_data(req)) + if (hdr->dwFlags & INTERNET_FLAG_ASYNC) { WORKREQUEST workRequest;
@@ -2172,6 +2303,7 @@ { res = HTTPREQ_Read(req, buffers->lpvBuffer, buffers->dwBufferLength, &buffers->dwBufferLength, FALSE); + size = buffers->dwBufferLength; LeaveCriticalSection( &req->read_section ); goto done; } @@ -2187,17 +2319,52 @@ return ERROR_IO_PENDING; }
- res = HTTPREQ_Read(req, buffers->lpvBuffer, buffers->dwBufferLength, &buffers->dwBufferLength, - !(flags & IRF_NO_WAIT)); + read = 0; + size = buffers->dwBufferLength; + + EnterCriticalSection( &req->read_section ); + if(hdr->dwError == ERROR_SUCCESS) + hdr->dwError = INTERNET_HANDLE_IN_USE; + else if(hdr->dwError == INTERNET_HANDLE_IN_USE) + hdr->dwError = ERROR_INTERNET_INTERNAL_ERROR; + + while(1) { + res = HTTPREQ_Read(req, (char*)buffers->lpvBuffer+read, size-read, + &buffers->dwBufferLength, !(flags & IRF_NO_WAIT)); + if(res == ERROR_SUCCESS) + read += buffers->dwBufferLength; + else + break; + + if(!req->read_chunked || read==size || req->dwContentLength!=req->dwContentRead + || !req->dwContentLength || (req->gzip_stream && req->gzip_stream->end_of_data)) + break; + LeaveCriticalSection( &req->read_section ); + + INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_RESPONSE_RECEIVED, + &buffers->dwBufferLength, sizeof(buffers->dwBufferLength)); + INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, + INTERNET_STATUS_RECEIVING_RESPONSE, NULL, 0); + + EnterCriticalSection( &req->read_section ); + } + + if(hdr->dwError == INTERNET_HANDLE_IN_USE) + hdr->dwError = ERROR_SUCCESS; + else + error = hdr->dwError; + + LeaveCriticalSection( &req->read_section ); + size = buffers->dwBufferLength; + buffers->dwBufferLength = read;
done: if (res == ERROR_SUCCESS) { - DWORD size = buffers->dwBufferLength; INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_RESPONSE_RECEIVED, &size, sizeof(size)); }
- return res; + return res==ERROR_SUCCESS ? error : res; }
static void HTTPREQ_AsyncReadFileExWProc(WORKREQUEST *workRequest) @@ -2225,7 +2392,7 @@ {
http_request_t *req = (http_request_t*)hdr; - DWORD res; + DWORD res, size, read, error = ERROR_SUCCESS;
if (flags & ~(IRF_ASYNC|IRF_NO_WAIT)) FIXME("these dwFlags aren't implemented: 0x%x\n", flags & ~(IRF_ASYNC|IRF_NO_WAIT)); @@ -2245,6 +2412,7 @@ { res = HTTPREQ_Read(req, buffers->lpvBuffer, buffers->dwBufferLength, &buffers->dwBufferLength, FALSE); + size = buffers->dwBufferLength; LeaveCriticalSection( &req->read_section ); goto done; } @@ -2260,17 +2428,52 @@ return ERROR_IO_PENDING; }
- res = HTTPREQ_Read(req, buffers->lpvBuffer, buffers->dwBufferLength, &buffers->dwBufferLength, - !(flags & IRF_NO_WAIT)); + read = 0; + size = buffers->dwBufferLength; + + EnterCriticalSection( &req->read_section ); + if(hdr->dwError == ERROR_SUCCESS) + hdr->dwError = INTERNET_HANDLE_IN_USE; + else if(hdr->dwError == INTERNET_HANDLE_IN_USE) + hdr->dwError = ERROR_INTERNET_INTERNAL_ERROR; + + while(1) { + res = HTTPREQ_Read(req, (char*)buffers->lpvBuffer+read, size-read, + &buffers->dwBufferLength, !(flags & IRF_NO_WAIT)); + if(res == ERROR_SUCCESS) + read += buffers->dwBufferLength; + else + break; + + if(!req->read_chunked || read==size || req->dwContentLength!=req->dwContentRead + || !req->dwContentLength || (req->gzip_stream && req->gzip_stream->end_of_data)) + break; + LeaveCriticalSection( &req->read_section ); + + INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_RESPONSE_RECEIVED, + &buffers->dwBufferLength, sizeof(buffers->dwBufferLength)); + INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, + INTERNET_STATUS_RECEIVING_RESPONSE, NULL, 0); + + EnterCriticalSection( &req->read_section ); + } + + if(hdr->dwError == INTERNET_HANDLE_IN_USE) + hdr->dwError = ERROR_SUCCESS; + else + error = hdr->dwError; + + LeaveCriticalSection( &req->read_section ); + size = buffers->dwBufferLength; + buffers->dwBufferLength = read;
done: if (res == ERROR_SUCCESS) { - DWORD size = buffers->dwBufferLength; INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_RESPONSE_RECEIVED, &size, sizeof(size)); }
- return res; + return res==ERROR_SUCCESS ? error : res; }
static DWORD HTTPREQ_WriteFile(object_header_t *hdr, const void *buffer, DWORD size, DWORD *written) @@ -3456,6 +3659,7 @@ do { DWORD len; + BOOL reusing_connection; char *ascii_req;
loop_next = FALSE; @@ -3506,6 +3710,11 @@ TRACE("Request header -> %s\n", debugstr_w(requestString) );
/* Send the request and store the results */ + if(NETCON_connected(&lpwhr->netConnection)) + reusing_connection = TRUE; + else + reusing_connection = FALSE; + if ((res = HTTP_OpenConnection(lpwhr)) != ERROR_SUCCESS) goto lend;
@@ -3547,6 +3756,13 @@ goto lend;
responseLen = HTTP_GetResponseHeaders(lpwhr, TRUE); + /* FIXME: We should know that connection is closed before sending + * headers. Otherwise wrong callbacks are executed */ + if(!responseLen && reusing_connection) { + TRACE("Connection closed by server, reconnecting\n"); + loop_next = TRUE; + continue; + }
INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, INTERNET_STATUS_RESPONSE_RECEIVED, &responseLen, @@ -3565,7 +3781,9 @@ { WCHAR *new_url, szNewLocation[INTERNET_MAX_URL_LENGTH]; dwBufferSize=sizeof(szNewLocation); - if ((dwStatusCode==HTTP_STATUS_REDIRECT || dwStatusCode==HTTP_STATUS_MOVED) && + if ((dwStatusCode == HTTP_STATUS_REDIRECT || + dwStatusCode == HTTP_STATUS_MOVED || + dwStatusCode == HTTP_STATUS_REDIRECT_METHOD) && HTTP_HttpQueryInfoW(lpwhr,HTTP_QUERY_LOCATION,szNewLocation,&dwBufferSize,NULL) == ERROR_SUCCESS) { if (strcmpW(lpwhr->lpszVerb, szGET) && strcmpW(lpwhr->lpszVerb, szHEAD)) @@ -3610,6 +3828,12 @@ break; } } + + if(!loop_next) { + TRACE("Cleaning wrong authorization data\n"); + destroy_authinfo(lpwhr->pAuthInfo); + lpwhr->pAuthInfo = NULL; + } } if (dwStatusCode == HTTP_STATUS_PROXY_AUTH_REQ) { @@ -3626,6 +3850,12 @@ break; } } + + if(!loop_next) { + TRACE("Cleaning wrong proxy authorization data\n"); + destroy_authinfo(lpwhr->pProxyAuthInfo); + lpwhr->pProxyAuthInfo = NULL; + } } } } @@ -3674,7 +3904,7 @@ HTTP_ReceiveRequestData(lpwhr, TRUE); else { - iar.dwResult = 0; + iar.dwResult = (res==ERROR_SUCCESS ? (DWORD_PTR)lpwhr->hdr.hInternet : 0); iar.dwError = res;
INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, @@ -3758,7 +3988,7 @@ } }
- iar.dwResult = (DWORD_PTR)lpwhr->hdr.hInternet; + iar.dwResult = (res==ERROR_SUCCESS ? (DWORD_PTR)lpwhr->hdr.hInternet : 0); iar.dwError = res;
INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, @@ -4459,9 +4689,6 @@
TRACE("-->\n");
- /* clear old response headers (eg. from a redirect response) */ - if (clear) HTTP_clear_response_headers( lpwhr ); - if (!NETCON_connected(&lpwhr->netConnection)) goto lend;
@@ -4473,6 +4700,13 @@ buflen = MAX_REPLY_LEN; if (!read_line(lpwhr, bufferA, &buflen)) goto lend; + + /* clear old response headers (eg. from a redirect response) */ + if (clear) { + HTTP_clear_response_headers( lpwhr ); + clear = FALSE; + } + rc += buflen; MultiByteToWideChar( CP_ACP, 0, bufferA, buflen, buffer, MAX_REPLY_LEN ); /* check is this a status code line? */
Modified: trunk/reactos/dll/win32/wininet/internet.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/wininet/internet.... ============================================================================== --- trunk/reactos/dll/win32/wininet/internet.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/wininet/internet.c [iso-8859-1] Sat Oct 9 20:08:18 2010 @@ -3569,8 +3569,8 @@
LPSTR INTERNET_GetNextLine(INT nSocket, LPDWORD dwLen) { + fd_set infd; struct timeval tv; - fd_set infd; BOOL bSuccess = FALSE; INT nRecv = 0; LPSTR lpszBuffer = INTERNET_GetResponseBuffer(); @@ -3578,13 +3578,13 @@ TRACE("\n");
FD_ZERO(&infd); - FD_SET(nSocket, &infd); - tv.tv_sec=RESPONSE_TIMEOUT; - tv.tv_usec=0; + FD_SET(nSocket,&infd); + tv.tv_sec = RESPONSE_TIMEOUT; + tv.tv_usec = 0;
while (nRecv < MAX_REPLY_LEN) { - if (select(nSocket+1,&infd,NULL,NULL,&tv) > 0) + if (select(0, &infd, NULL, NULL, &tv) > 0) { if (recv(nSocket, &lpszBuffer[nRecv], 1, 0) <= 0) {
Modified: trunk/reactos/dll/win32/wininet/internet.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/wininet/internet.... ============================================================================== --- trunk/reactos/dll/win32/wininet/internet.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/wininet/internet.h [iso-8859-1] Sat Oct 9 20:08:18 2010 @@ -53,6 +53,7 @@ BOOL useSSL; int socketFD; void *ssl_s; + DWORD security_flags; } WININET_NETCONNECTION;
static inline LPWSTR heap_strdupW(LPCWSTR str) @@ -66,6 +67,27 @@ ret = HeapAlloc(GetProcessHeap(), 0, size); if(ret) memcpy(ret, str, size); + } + + return ret; +} + +static inline LPWSTR heap_strndupW(LPCWSTR str, UINT max_len) +{ + LPWSTR ret; + UINT len; + + if(!str) + return NULL; + + for(len=0; len<max_len; len++) + if(str[len] == '\0') + break; + + ret = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*(len+1)); + if(ret) { + memcpy(ret, str, sizeof(WCHAR)*len); + ret[len] = '\0'; }
return ret; @@ -147,6 +169,8 @@ DWORD (*QueryDataAvailable)(object_header_t*,DWORD*,DWORD,DWORD_PTR); DWORD (*FindNextFileW)(object_header_t*,void*); } object_vtbl_t; + +#define INTERNET_HANDLE_IN_USE 1
struct _object_header_t { @@ -436,6 +460,7 @@ int *recvd /* out */); BOOL NETCON_query_data_available(WININET_NETCONNECTION *connection, DWORD *available); LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection); +int NETCON_GetCipherStrength(WININET_NETCONNECTION *connection); DWORD NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value); #define sock_get_error(x) WSAGetLastError()
Modified: trunk/reactos/dll/win32/wininet/netconnection.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/wininet/netconnec... ============================================================================== --- trunk/reactos/dll/win32/wininet/netconnection.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/wininet/netconnection.c [iso-8859-1] Sat Oct 9 20:08:18 2010 @@ -60,6 +60,7 @@ #endif #ifdef HAVE_OPENSSL_SSL_H # include <openssl/ssl.h> +# include <openssl/opensslv.h> #undef FAR #undef DSA #endif @@ -113,10 +114,15 @@ static void *OpenSSL_ssl_handle; static void *OpenSSL_crypto_handle;
+#if defined(OPENSSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER> 0x1000000) +static const SSL_METHOD *meth; +#else static SSL_METHOD *meth; +#endif static SSL_CTX *ctx; static int hostname_idx; static int error_idx; +static int conn_idx;
#define MAKE_FUNCPTR(f) static typeof(f) * p##f
@@ -139,12 +145,13 @@ MAKE_FUNCPTR(SSL_get_ex_data); MAKE_FUNCPTR(SSL_set_ex_data); MAKE_FUNCPTR(SSL_get_ex_data_X509_STORE_CTX_idx); -MAKE_FUNCPTR(SSL_get_verify_result); MAKE_FUNCPTR(SSL_get_peer_certificate); MAKE_FUNCPTR(SSL_CTX_get_timeout); MAKE_FUNCPTR(SSL_CTX_set_timeout); MAKE_FUNCPTR(SSL_CTX_set_default_verify_paths); MAKE_FUNCPTR(SSL_CTX_set_verify); +MAKE_FUNCPTR(SSL_get_current_cipher); +MAKE_FUNCPTR(SSL_CIPHER_get_bits); MAKE_FUNCPTR(X509_STORE_CTX_get_ex_data);
/* OpenSSL's libcrypto functions that we use */ @@ -214,7 +221,7 @@ }
static DWORD netconn_verify_cert(PCCERT_CONTEXT cert, HCERTSTORE store, - WCHAR *server) + WCHAR *server, DWORD security_flags) { BOOL ret; CERT_CHAIN_PARA chainPara = { sizeof(chainPara), { 0 } }; @@ -231,38 +238,58 @@ { if (chain->TrustStatus.dwErrorStatus) { + static const DWORD supportedErrors = + CERT_TRUST_IS_NOT_TIME_VALID | + CERT_TRUST_IS_UNTRUSTED_ROOT | + CERT_TRUST_IS_OFFLINE_REVOCATION | + CERT_TRUST_REVOCATION_STATUS_UNKNOWN | + CERT_TRUST_IS_REVOKED | + CERT_TRUST_IS_NOT_VALID_FOR_USAGE; + if (chain->TrustStatus.dwErrorStatus & CERT_TRUST_IS_NOT_TIME_VALID) err = ERROR_INTERNET_SEC_CERT_DATE_INVALID; else if (chain->TrustStatus.dwErrorStatus & - CERT_TRUST_IS_UNTRUSTED_ROOT) + CERT_TRUST_IS_UNTRUSTED_ROOT && + !(security_flags & SECURITY_FLAG_IGNORE_UNKNOWN_CA)) err = ERROR_INTERNET_INVALID_CA; - else if ((chain->TrustStatus.dwErrorStatus & + else if (!(security_flags & SECURITY_FLAG_IGNORE_REVOCATION) && + ((chain->TrustStatus.dwErrorStatus & CERT_TRUST_IS_OFFLINE_REVOCATION) || + (chain->TrustStatus.dwErrorStatus & + CERT_TRUST_REVOCATION_STATUS_UNKNOWN))) + err = ERROR_INTERNET_SEC_CERT_NO_REV; + else if (!(security_flags & SECURITY_FLAG_IGNORE_REVOCATION) && + (chain->TrustStatus.dwErrorStatus & CERT_TRUST_IS_REVOKED)) + err = ERROR_INTERNET_SEC_CERT_REVOKED; + else if (!(security_flags & SECURITY_FLAG_IGNORE_WRONG_USAGE) && (chain->TrustStatus.dwErrorStatus & - CERT_TRUST_REVOCATION_STATUS_UNKNOWN)) - err = ERROR_INTERNET_SEC_CERT_NO_REV; - else if (chain->TrustStatus.dwErrorStatus & CERT_TRUST_IS_REVOKED) - err = ERROR_INTERNET_SEC_CERT_REVOKED; - else if (chain->TrustStatus.dwErrorStatus & - CERT_TRUST_IS_NOT_VALID_FOR_USAGE) + CERT_TRUST_IS_NOT_VALID_FOR_USAGE)) err = ERROR_INTERNET_SEC_INVALID_CERT; - else + else if (chain->TrustStatus.dwErrorStatus & ~supportedErrors) err = ERROR_INTERNET_SEC_INVALID_CERT; } - else + if (!err) { CERT_CHAIN_POLICY_PARA policyPara; SSL_EXTRA_CERT_CHAIN_POLICY_PARA sslExtraPolicyPara; CERT_CHAIN_POLICY_STATUS policyStatus; - + CERT_CHAIN_CONTEXT chainCopy; + + /* Clear chain->TrustStatus.dwErrorStatus so + * CertVerifyCertificateChainPolicy will verify additional checks + * rather than stopping with an existing, ignored error. + */ + memcpy(&chainCopy, chain, sizeof(chainCopy)); + chainCopy.TrustStatus.dwErrorStatus = 0; sslExtraPolicyPara.u.cbSize = sizeof(sslExtraPolicyPara); sslExtraPolicyPara.dwAuthType = AUTHTYPE_SERVER; sslExtraPolicyPara.pwszServerName = server; + sslExtraPolicyPara.fdwChecks = security_flags; policyPara.cbSize = sizeof(policyPara); policyPara.dwFlags = 0; policyPara.pvExtraPolicyPara = &sslExtraPolicyPara; ret = CertVerifyCertificateChainPolicy(CERT_CHAIN_POLICY_SSL, - chain, &policyPara, &policyStatus); + &chainCopy, &policyPara, &policyStatus); /* Any error in the policy status indicates that the * policy couldn't be verified. */ @@ -285,55 +312,52 @@ SSL *ssl; WCHAR *server; BOOL ret = FALSE; + HCERTSTORE store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, + CERT_STORE_CREATE_NEW_FLAG, NULL); + WININET_NETCONNECTION *conn;
ssl = pX509_STORE_CTX_get_ex_data(ctx, pSSL_get_ex_data_X509_STORE_CTX_idx()); server = pSSL_get_ex_data(ssl, hostname_idx); - if (preverify_ok) - { - HCERTSTORE store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, - CERT_STORE_CREATE_NEW_FLAG, NULL); - - if (store) - { - X509 *cert; - int i; - PCCERT_CONTEXT endCert = NULL; - - ret = TRUE; - for (i = 0; ret && i < psk_num((struct stack_st *)ctx->chain); i++) + conn = pSSL_get_ex_data(ssl, conn_idx); + if (store) + { + X509 *cert; + int i; + PCCERT_CONTEXT endCert = NULL; + + ret = TRUE; + for (i = 0; ret && i < psk_num((struct stack_st *)ctx->chain); i++) + { + PCCERT_CONTEXT context; + + cert = (X509 *)psk_value((struct stack_st *)ctx->chain, i); + if ((context = X509_to_cert_context(cert))) { - PCCERT_CONTEXT context; - - cert = (X509 *)psk_value((struct stack_st *)ctx->chain, i); - if ((context = X509_to_cert_context(cert))) - { - if (i == 0) - ret = CertAddCertificateContextToStore(store, context, - CERT_STORE_ADD_ALWAYS, &endCert); - else - ret = CertAddCertificateContextToStore(store, context, - CERT_STORE_ADD_ALWAYS, NULL); - CertFreeCertificateContext(context); - } + if (i == 0) + ret = CertAddCertificateContextToStore(store, context, + CERT_STORE_ADD_ALWAYS, &endCert); + else + ret = CertAddCertificateContextToStore(store, context, + CERT_STORE_ADD_ALWAYS, NULL); + CertFreeCertificateContext(context); } - if (!endCert) ret = FALSE; - if (ret) + } + if (!endCert) ret = FALSE; + if (ret) + { + DWORD_PTR err = netconn_verify_cert(endCert, store, server, + conn->security_flags); + + if (err) { - DWORD_PTR err = netconn_verify_cert(endCert, store, server); - - if (err) - { - pSSL_set_ex_data(ssl, error_idx, (void *)err); - ret = FALSE; - } + pSSL_set_ex_data(ssl, error_idx, (void *)err); + ret = FALSE; } - CertFreeCertificateContext(endCert); - CertCloseStore(store, 0); - } - } else - pSSL_set_ex_data(ssl, error_idx, (void *)ERROR_INTERNET_SEC_CERT_ERRORS); - + } + CertFreeCertificateContext(endCert); + CertCloseStore(store, 0); + } return ret; }
@@ -400,12 +424,13 @@ DYNSSL(SSL_get_ex_data); DYNSSL(SSL_set_ex_data); DYNSSL(SSL_get_ex_data_X509_STORE_CTX_idx); - DYNSSL(SSL_get_verify_result); DYNSSL(SSL_get_peer_certificate); DYNSSL(SSL_CTX_get_timeout); DYNSSL(SSL_CTX_set_timeout); DYNSSL(SSL_CTX_set_default_verify_paths); DYNSSL(SSL_CTX_set_verify); + DYNSSL(SSL_get_current_cipher); + DYNSSL(SSL_CIPHER_get_bits); DYNSSL(X509_STORE_CTX_get_ex_data); #undef DYNSSL
@@ -454,6 +479,15 @@ error_idx = pSSL_get_ex_new_index(0, (void *)"error index", NULL, NULL, NULL); if (error_idx == -1) + { + ERR("SSL_get_ex_new_index failed; %s\n", + pERR_error_string(pERR_get_error(), 0)); + LeaveCriticalSection(&init_ssl_cs); + return ERROR_OUTOFMEMORY; + } + conn_idx = pSSL_get_ex_new_index(0, (void *)"netconn index", + NULL, NULL, NULL); + if (conn_idx == -1) { ERR("SSL_get_ex_new_index failed; %s\n", pERR_error_string(pERR_get_error(), 0)); @@ -637,10 +671,8 @@ DWORD NETCON_secure_connect(WININET_NETCONNECTION *connection, LPWSTR hostname) { DWORD res = ERROR_NOT_SUPPORTED; + #ifdef SONAME_LIBSSL - long verify_res; - X509 *cert; - /* can't connect if we are already connected */ if (connection->useSSL) { @@ -665,6 +697,20 @@ goto fail; }
+ if (!pSSL_set_ex_data(connection->ssl_s, hostname_idx, hostname)) + { + ERR("SSL_set_ex_data failed: %s\n", + pERR_error_string(pERR_get_error(), 0)); + res = ERROR_INTERNET_SECURITY_CHANNEL_ERROR; + goto fail; + } + if (!pSSL_set_ex_data(connection->ssl_s, conn_idx, connection)) + { + ERR("SSL_set_ex_data failed: %s\n", + pERR_error_string(pERR_get_error(), 0)); + res = ERROR_INTERNET_SECURITY_CHANNEL_ERROR; + goto fail; + } if (pSSL_connect(connection->ssl_s) <= 0) { res = (DWORD_PTR)pSSL_get_ex_data(connection->ssl_s, error_idx); @@ -672,22 +718,6 @@ res = ERROR_INTERNET_SECURITY_CHANNEL_ERROR; ERR("SSL_connect failed: %d\n", res); goto fail; - } - pSSL_set_ex_data(connection->ssl_s, hostname_idx, hostname); - cert = pSSL_get_peer_certificate(connection->ssl_s); - if (!cert) - { - ERR("no certificate for server %s\n", debugstr_w(hostname)); - /* FIXME: is this the best error? */ - res = ERROR_INTERNET_INVALID_CA; - goto fail; - } - verify_res = pSSL_get_verify_result(connection->ssl_s); - if (verify_res != X509_V_OK) - { - ERR("couldn't verify the security of the connection, %ld\n", verify_res); - /* FIXME: we should set an error and return, but we only warn at - * the moment */ }
connection->useSSL = TRUE; @@ -772,6 +802,8 @@ if (!connection->useSSL) { *recvd = recv(connection->socketFD, buf, len, flags); + if(!*recvd) + NETCON_close(connection); return *recvd == -1 ? sock_get_error(errno) : ERROR_SUCCESS; } else @@ -781,8 +813,10 @@
/* Check if EOF was received */ if(!*recvd && (pSSL_get_error(connection->ssl_s, *recvd)==SSL_ERROR_ZERO_RETURN - || pSSL_get_error(connection->ssl_s, *recvd)==SSL_ERROR_SYSCALL)) + || pSSL_get_error(connection->ssl_s, *recvd)==SSL_ERROR_SYSCALL)) { + NETCON_close(connection); return ERROR_SUCCESS; + }
return *recvd > 0 ? ERROR_SUCCESS : ERROR_INTERNET_CONNECTION_ABORTED; #else @@ -840,6 +874,24 @@ #endif }
+int NETCON_GetCipherStrength(WININET_NETCONNECTION *connection) +{ +#ifdef SONAME_LIBSSL + SSL_CIPHER *cipher; + int bits = 0; + + if (!connection->useSSL) + return 0; + cipher = pSSL_get_current_cipher(connection->ssl_s); + if (!cipher) + return 0; + pSSL_CIPHER_get_bits(cipher, &bits); + return bits; +#else + return 0; +#endif +} + DWORD NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value) { int result;
Modified: trunk/reactos/dll/win32/wininet/urlcache.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/wininet/urlcache.... ============================================================================== --- trunk/reactos/dll/win32/wininet/urlcache.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/wininet/urlcache.c [iso-8859-1] Sat Oct 9 20:08:18 2010 @@ -2184,14 +2184,17 @@ ) { WCHAR *url_name; - WCHAR *file_extension; + WCHAR *file_extension = NULL; WCHAR file_name[MAX_PATH]; BOOL bSuccess = FALSE; DWORD dwError = 0;
+ TRACE("(%s %d %s %p %d)\n", debugstr_a(lpszUrlName), dwExpectedFileSize, + debugstr_a(lpszFileExtension), lpszFileName, dwReserved); + if (lpszUrlName && (url_name = heap_strdupAtoW(lpszUrlName))) { - if (lpszFileExtension && (file_extension = heap_strdupAtoW(lpszFileExtension))) + if (!lpszFileExtension || (file_extension = heap_strdupAtoW(lpszFileExtension))) { if (CreateUrlCacheEntryW(url_name, dwExpectedFileSize, file_extension, file_name, dwReserved)) { @@ -2268,6 +2271,12 @@ if (((lpszUrlEnd - lpszUrlName) > 1) && (*(lpszUrlEnd - 1) == '/' || *(lpszUrlEnd - 1) == '\')) lpszUrlEnd--;
+ lpszUrlPart = memchrW(lpszUrlName, '?', lpszUrlEnd - lpszUrlName); + if (!lpszUrlPart) + lpszUrlPart = memchrW(lpszUrlName, '#', lpszUrlEnd - lpszUrlName); + if (lpszUrlPart) + lpszUrlEnd = lpszUrlPart; + for (lpszUrlPart = lpszUrlEnd; (lpszUrlPart >= lpszUrlName); lpszUrlPart--) @@ -2278,10 +2287,6 @@ lpszUrlPart++; break; } - else if(*lpszUrlPart == '?' || *lpszUrlPart == '#') - { - lpszUrlEnd = lpszUrlPart; - } } if (!lstrcmpW(lpszUrlPart, szWWW)) { @@ -2327,7 +2332,13 @@ CacheDir = (BYTE)(rand() % pHeader->DirectoryCount);
lBufferSize = MAX_PATH * sizeof(WCHAR); - URLCache_LocalFileNameToPathW(pContainer, pHeader, szFile, CacheDir, lpszFileName, &lBufferSize); + if (!URLCache_LocalFileNameToPathW(pContainer, pHeader, szFile, CacheDir, lpszFileName, &lBufferSize)) + { + WARN("Failed to get full path for filename %s, needed %u bytes.\n", + debugstr_a(szFile), lBufferSize); + URLCacheContainer_UnlockIndex(pContainer, pHeader); + return FALSE; + }
URLCacheContainer_UnlockIndex(pContainer, pHeader);
Modified: trunk/reactos/dll/win32/wininet/wininet_ros.diff URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/wininet/wininet_r... ============================================================================== --- trunk/reactos/dll/win32/wininet/wininet_ros.diff [iso-8859-1] (original) +++ trunk/reactos/dll/win32/wininet/wininet_ros.diff [iso-8859-1] Sat Oct 9 20:08:18 2010 @@ -1,7 +1,18 @@ ---- D:/Wine-CVS/wine/dlls/wininet/http.c Wed May 28 14:33:28 2008 -+++ D:/ReactOS-Trunk/reactos/dll/win32/wininet/http.c Sun Jun 15 18:16:06 2008 -@@ -61,6 +61,8 @@ - #include "wine/debug.h" +--- wine-1.3.4/dlls/wininet/internet.h 2010-10-01 14:46:44.000000000 -0400 ++++ dll/win32/wininet/internet.h 2010-10-09 15:34:13.000000000 -0400 +@@ -462,7 +462,7 @@ + LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection); + int NETCON_GetCipherStrength(WININET_NETCONNECTION *connection); + DWORD NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value); +-int sock_get_error(int); ++#define sock_get_error(x) WSAGetLastError() + + extern void URLCacheContainers_CreateDefaults(void); + extern void URLCacheContainers_DeleteAll(void); +--- wine-1.3.4/dlls/wininet/http.c 2010-10-01 14:46:44.000000000 -0400 ++++ dll/win32/wininet/http.c 2010-10-09 15:28:29.000000000 -0400 +@@ -69,6 +69,8 @@ + #include "wine/exception.h" #include "wine/unicode.h"
+#include "inet_ntop.c" @@ -9,95 +20,21 @@ WINE_DEFAULT_DEBUG_CHANNEL(wininet);
static const WCHAR g_szHttp1_0[] = {'H','T','T','P','/','1','.','0',0}; ---- D:/Wine-CVS/wine/dlls/wininet/internet.c Wed May 28 14:33:28 2008 -+++ D:/ReactOS-Trunk/reactos/dll/win32/wininet/internet.c Fri May 30 18:04:29 2008 -@@ -3101,19 +3101,22 @@ - - LPSTR INTERNET_GetNextLine(INT nSocket, LPDWORD dwLen) - { -- struct pollfd pfd; -+ struct timeval tv; -+ fd_set infd; - BOOL bSuccess = FALSE; - INT nRecv = 0; - LPSTR lpszBuffer = INTERNET_GetResponseBuffer(); - - TRACE("\n"); - -- pfd.fd = nSocket; -- pfd.events = POLLIN; -+ FD_ZERO(&infd); -+ FD_SET(nSocket, &infd); -+ tv.tv_sec=RESPONSE_TIMEOUT; -+ tv.tv_usec=0; - - while (nRecv < MAX_REPLY_LEN) - { -- if (poll(&pfd,1, RESPONSE_TIMEOUT * 1000) > 0) -+ if (select(nSocket+1,&infd,NULL,NULL,&tv) > 0) - { - if (recv(nSocket, &lpszBuffer[nRecv], 1, 0) <= 0) - { ---- D:/Wine-CVS/wine/dlls/wininet/internet.h Fri Mar 28 20:13:36 2008 -+++ D:/ReactOS-Trunk/reactos/dll/win32/wininet/internet.h Thu May 29 19:01:31 2008 -@@ -23,6 +23,9 @@ - #ifndef _WINE_INTERNET_H_ - #define _WINE_INTERNET_H_ - -+/* ReactOS-specific definitions */ -+#define CP_UNIXCP CP_THREAD_ACP -+ - #ifndef __WINE_CONFIG_H - # error You must include config.h to use this header - #endif ---- D:/Wine-CVS/wine/dlls/wininet/netconnection.c Sat May 17 12:09:49 2008 -+++ D:/ReactOS-Trunk/reactos/dll/win32/wininet/netconnection.c Sat May 31 12:01:55 2008 -@@ -64,7 +64,7 @@ - #include "winsock2.h" - - #define RESPONSE_TIMEOUT 30 /* FROM internet.c */ -- -+#define sock_get_error(x) WSAGetLastError() - - WINE_DEFAULT_DEBUG_CHANNEL(wininet); - -@@ -206,6 +206,7 @@ +--- wine-1.3.4/dlls/wininet/netconnection.c 2010-10-01 14:46:44.000000000 -0400 ++++ dll/win32/wininet/netconnection.c 2010-10-09 15:33:53.000000000 -0400 +@@ -547,6 +547,7 @@ return TRUE; }
+#if 0 /* translate a unix error code into a winsock one */ - static int sock_get_error( int err ) + int sock_get_error( int err ) { -@@ -272,6 +273,7 @@ +@@ -613,6 +614,7 @@ #endif return err; } +#endif
/****************************************************************************** - * NETCON_create -@@ -616,16 +618,19 @@ - - if (!connection->useSSL) - { -- struct pollfd pfd; -+ struct timeval tv; -+ fd_set infd; - BOOL bSuccess = FALSE; - DWORD nRecv = 0; - -- pfd.fd = connection->socketFD; -- pfd.events = POLLIN; -+ FD_ZERO(&infd); -+ FD_SET(connection->socketFD, &infd); -+ tv.tv_sec=RESPONSE_TIMEOUT; -+ tv.tv_usec=0; - - while (nRecv < *dwBuffer) - { -- if (poll(&pfd,1, RESPONSE_TIMEOUT * 1000) > 0) -+ if (select(connection->socketFD+1,&infd,NULL,NULL,&tv) > 0) - { - if (recv(connection->socketFD, &lpszBuffer[nRecv], 1, 0) <= 0) - { + * NETCON_create