Author: cwittich Date: Wed Apr 15 13:17:12 2009 New Revision: 40520
URL: http://svn.reactos.org/svn/reactos?rev=40520&view=rev Log: sync wininet urlcache.c with wine 1.1.19 - fixes memory corruptions
Modified: trunk/reactos/dll/win32/wininet/urlcache.c
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] Wed Apr 15 13:17:12 2009 @@ -2,7 +2,7 @@ * Wininet - Url Cache functions * * Copyright 2001,2002 CodeWeavers - * Copyright 2003 Robert Shearman + * Copyright 2003-2008 Robert Shearman * * Eric Kohl * Aric Stewart @@ -25,14 +25,22 @@ #include "config.h" #include "wine/port.h"
+#define NONAMELESSUNION +#define NONAMELESSSTRUCT + +#if defined(__MINGW32__) || defined (_MSC_VER) +#include <ws2tcpip.h> +#endif + #include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <sys/types.h> +#ifdef HAVE_SYS_SOCKET_H +# include <sys/socket.h> +#endif #include <time.h> - -#define NONAMELESSUNION -#define NONAMELESSSTRUCT
#include "windef.h" #include "winbase.h" @@ -178,7 +186,7 @@ /* List of all containers available */ static struct list UrlContainers = LIST_INIT(UrlContainers);
-static HASH_CACHEFILE_ENTRY *URLCache_CreateHashTable(LPURLCACHE_HEADER pHeader, HASH_CACHEFILE_ENTRY *pPrevHash); +static DWORD URLCache_CreateHashTable(LPURLCACHE_HEADER pHeader, HASH_CACHEFILE_ENTRY *pPrevHash, HASH_CACHEFILE_ENTRY **ppHash);
/*********************************************************************** * URLCache_PathToObjectName (Internal) @@ -206,11 +214,11 @@ * Opens the index file and saves mapping handle in hCacheIndexMapping * * RETURNS - * TRUE if succeeded - * FALSE if failed - * - */ -static BOOL URLCacheContainer_OpenIndex(URLCACHECONTAINER * pContainer) + * ERROR_SUCCESS if succeeded + * Any other Win32 error code if failed + * + */ +static DWORD URLCacheContainer_OpenIndex(URLCACHECONTAINER * pContainer) { HANDLE hFile; WCHAR wszFilePath[MAX_PATH]; @@ -220,7 +228,7 @@ static const WCHAR wszMappingFormat[] = {'%','s','%','s','_','%','l','u',0};
if (pContainer->hMapping) - return TRUE; + return ERROR_SUCCESS;
strcpyW(wszFilePath, pContainer->path); strcatW(wszFilePath, wszIndex); @@ -235,7 +243,7 @@ if (hFile == INVALID_HANDLE_VALUE) { TRACE("Could not open or create cache index file "%s"\n", debugstr_w(wszFilePath)); - return FALSE; + return GetLastError(); }
/* At this stage we need the mutex because we may be about to create the @@ -247,7 +255,7 @@ if (dwFileSize == INVALID_FILE_SIZE) { ReleaseMutex(pContainer->hMutex); - return FALSE; + return GetLastError(); }
if (dwFileSize == 0) @@ -256,7 +264,7 @@ HKEY key; char achZeroes[0x1000]; DWORD dwOffset; - DWORD dwError = 0; + DWORD dwError = ERROR_SUCCESS;
/* Write zeroes to the entire file so we can safely map it without * fear of getting a SEGV because the disk is full. @@ -282,7 +290,7 @@ } }
- if (!dwError) + if (dwError == ERROR_SUCCESS) { HANDLE hMapping = CreateFileMappingW(hFile, NULL, PAGE_READWRITE, 0, NEWFILE_SIZE, NULL);
@@ -296,6 +304,7 @@ WCHAR wszDirPath[MAX_PATH]; FILETIME ft; int i, j; + HASH_CACHEFILE_ENTRY *pHashEntry;
dwFileSize = NEWFILE_SIZE; @@ -326,7 +335,7 @@ RegCloseKey(key); } - URLCache_CreateHashTable(pHeader, NULL); + URLCache_CreateHashTable(pHeader, NULL, &pHashEntry);
/* Last step - create the directories */ @@ -416,8 +425,7 @@ CloseHandle(hFile); DeleteFileW(wszFilePath); ReleaseMutex(pContainer->hMutex); - SetLastError(dwError); - return FALSE; + return dwError; }
} @@ -433,10 +441,10 @@ if (!pContainer->hMapping) { ERR("Couldn't create file mapping (error is %d)\n", GetLastError()); - return FALSE; - } - - return TRUE; + return GetLastError(); + } + + return ERROR_SUCCESS; }
/*********************************************************************** @@ -579,7 +587,7 @@ ); }
-static BOOL URLCacheContainers_FindContainerW(LPCWSTR lpwszUrl, URLCACHECONTAINER ** ppContainer) +static DWORD URLCacheContainers_FindContainerW(LPCWSTR lpwszUrl, URLCACHECONTAINER ** ppContainer) { URLCACHECONTAINER * pContainer;
@@ -590,19 +598,18 @@ int prefix_len = strlenW(pContainer->cache_prefix); if (!strncmpW(pContainer->cache_prefix, lpwszUrl, prefix_len)) { - TRACE("found container with prefx %s for URL %s\n", debugstr_w(pContainer->cache_prefix), debugstr_w(lpwszUrl)); + TRACE("found container with prefix %s for URL %s\n", debugstr_w(pContainer->cache_prefix), debugstr_w(lpwszUrl)); *ppContainer = pContainer; - return TRUE; + return ERROR_SUCCESS; } } ERR("no container found\n"); - SetLastError(ERROR_FILE_NOT_FOUND); - return FALSE; -} - -static BOOL URLCacheContainers_FindContainerA(LPCSTR lpszUrl, URLCACHECONTAINER ** ppContainer) -{ - BOOL ret; + return ERROR_FILE_NOT_FOUND; +} + +static DWORD URLCacheContainers_FindContainerA(LPCSTR lpszUrl, URLCACHECONTAINER ** ppContainer) +{ + DWORD ret; LPWSTR lpwszUrl; int url_len = MultiByteToWideChar(CP_ACP, 0, lpszUrl, -1, NULL, 0); if (url_len && (lpwszUrl = HeapAlloc(GetProcessHeap(), 0, url_len * sizeof(WCHAR)))) @@ -612,7 +619,7 @@ HeapFree(GetProcessHeap(), 0, lpwszUrl); return ret; } - return FALSE; + return GetLastError(); }
static BOOL URLCacheContainers_Enum(LPCWSTR lpwszSearchPattern, DWORD dwIndex, URLCACHECONTAINER ** ppContainer) @@ -654,12 +661,18 @@ /*********************************************************************** * URLCacheContainer_LockIndex (Internal) * + * Locks the index for system-wide exclusive access. + * + * RETURNS + * Cache file header if successful + * NULL if failed and calls SetLastError. */ static LPURLCACHE_HEADER URLCacheContainer_LockIndex(URLCACHECONTAINER * pContainer) { BYTE index; LPVOID pIndexData; URLCACHE_HEADER * pHeader; + DWORD error;
/* acquire mutex */ WaitForSingleObject(pContainer->hMutex, INFINITE); @@ -670,7 +683,7 @@ { ReleaseMutex(pContainer->hMutex); ERR("Couldn't MapViewOfFile. Error: %d\n", GetLastError()); - return FALSE; + return NULL; } pHeader = (URLCACHE_HEADER *)pIndexData;
@@ -680,10 +693,12 @@ if (pHeader->dwFileSize != pContainer->file_size) { URLCacheContainer_CloseIndex(pContainer); - if (!URLCacheContainer_OpenIndex(pContainer)) + error = URLCacheContainer_OpenIndex(pContainer); + if (error != ERROR_SUCCESS) { ReleaseMutex(pContainer->hMutex); - return FALSE; + SetLastError(error); + return NULL; } pIndexData = MapViewOfFile(pContainer->hMapping, FILE_MAP_WRITE, 0, 0, 0);
@@ -691,7 +706,7 @@ { ReleaseMutex(pContainer->hMutex); ERR("Couldn't MapViewOfFile. Error: %d\n", GetLastError()); - return FALSE; + return NULL; } pHeader = (URLCACHE_HEADER *)pIndexData; } @@ -931,11 +946,11 @@ * Copies an entry from the cache index file to the Win32 structure * * RETURNS - * TRUE if the buffer was big enough - * FALSE if the buffer was too small - * - */ -static BOOL URLCache_CopyEntry( + * ERROR_SUCCESS if the buffer was big enough + * ERROR_INSUFFICIENT_BUFFER if the buffer was too small + * + */ +static DWORD URLCache_CopyEntry( URLCACHECONTAINER * pContainer, LPCURLCACHE_HEADER pHeader, LPINTERNET_CACHE_ENTRY_INFOA lpCacheEntryInfo, @@ -983,9 +998,9 @@ DWORD lenUrlBytes = (lenUrl+1) * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR));
lpCacheEntryInfo->lpszSourceUrlName = (LPSTR)lpCacheEntryInfo + dwRequiredSize - lenUrlBytes; - if (bUnicode) - MultiByteToWideChar(CP_ACP, 0, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl, -1, (LPWSTR)lpCacheEntryInfo->lpszSourceUrlName, lenUrl + 1); - else + if (bUnicode) + MultiByteToWideChar(CP_ACP, 0, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl, -1, (LPWSTR)lpCacheEntryInfo->lpszSourceUrlName, lenUrl + 1); + else memcpy(lpCacheEntryInfo->lpszSourceUrlName, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl, lenUrlBytes); }
@@ -1000,7 +1015,7 @@ lpszLocalFileName = (LPSTR)lpCacheEntryInfo + dwRequiredSize; nLocalFilePathSize = *lpdwBufferSize - dwRequiredSize; if ((bUnicode && URLCache_LocalFileNameToPathW(pContainer, pHeader, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetLocalName, pUrlEntry->CacheDir, (LPWSTR)lpszLocalFileName, &nLocalFilePathSize)) || - URLCache_LocalFileNameToPathA(pContainer, pHeader, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetLocalName, pUrlEntry->CacheDir, lpszLocalFileName, &nLocalFilePathSize)) + (!bUnicode && URLCache_LocalFileNameToPathA(pContainer, pHeader, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetLocalName, pUrlEntry->CacheDir, lpszLocalFileName, &nLocalFilePathSize))) { lpCacheEntryInfo->lpszLocalFileName = lpszLocalFileName; } @@ -1049,11 +1064,10 @@ if (dwRequiredSize > *lpdwBufferSize) { *lpdwBufferSize = dwRequiredSize; - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return FALSE; + return ERROR_INSUFFICIENT_BUFFER; } *lpdwBufferSize = dwRequiredSize; - return TRUE; + return ERROR_SUCCESS; }
@@ -1064,11 +1078,11 @@ * according to the flags set by dwFieldControl. * * RETURNS - * TRUE if the buffer was big enough - * FALSE if the buffer was too small - * - */ -static BOOL URLCache_SetEntryInfo(URL_CACHEFILE_ENTRY * pUrlEntry, const INTERNET_CACHE_ENTRY_INFOW * lpCacheEntryInfo, DWORD dwFieldControl) + * ERROR_SUCCESS if the buffer was big enough + * ERROR_INSUFFICIENT_BUFFER if the buffer was too small + * + */ +static DWORD URLCache_SetEntryInfo(URL_CACHEFILE_ENTRY * pUrlEntry, const INTERNET_CACHE_ENTRY_INFOW * lpCacheEntryInfo, DWORD dwFieldControl) { if (dwFieldControl & CACHE_ENTRY_ACCTIME_FC) pUrlEntry->LastAccessTime = lpCacheEntryInfo->LastAccessTime; @@ -1087,7 +1101,7 @@ if (dwFieldControl & CACHE_ENTRY_SYNCTIME_FC) FileTimeToDosDateTime(&lpCacheEntryInfo->LastAccessTime, &pUrlEntry->wLastSyncDate, &pUrlEntry->wLastSyncTime);
- return TRUE; + return ERROR_SUCCESS; }
/*********************************************************************** @@ -1285,11 +1299,11 @@ * key are entered into the hash table. * * RETURNS - * TRUE if the entry was added - * FALSE if the entry could not be added - * - */ -static BOOL URLCache_AddEntryToHash(LPURLCACHE_HEADER pHeader, LPCSTR lpszUrl, DWORD dwOffsetEntry) + * ERROR_SUCCESS if the entry was added + * Any other Win32 error code if the entry could not be added + * + */ +static DWORD URLCache_AddEntryToHash(LPURLCACHE_HEADER pHeader, LPCSTR lpszUrl, DWORD dwOffsetEntry) { /* see URLCache_FindEntryInHash for structure of hash tables */
@@ -1297,6 +1311,7 @@ DWORD offset = (key % HASHTABLE_NUM_ENTRIES) * sizeof(struct _HASH_ENTRY); HASH_CACHEFILE_ENTRY * pHashEntry; DWORD dwHashTableNumber = 0; + DWORD error;
key = (key / HASHTABLE_NUM_ENTRIES) * HASHTABLE_NUM_ENTRIES;
@@ -1324,17 +1339,17 @@ { pHashElement->dwHashKey = key; pHashElement->dwOffsetEntry = dwOffsetEntry; - return TRUE; + return ERROR_SUCCESS; } } } - pHashEntry = URLCache_CreateHashTable(pHeader, pHashEntry); - if (!pHashEntry) - return FALSE; + error = URLCache_CreateHashTable(pHeader, pHashEntry, &pHashEntry); + if (error != ERROR_SUCCESS) + return error;
pHashEntry->HashTable[offset].dwHashKey = key; pHashEntry->HashTable[offset].dwOffsetEntry = dwOffsetEntry; - return TRUE; + return ERROR_SUCCESS; }
/*********************************************************************** @@ -1344,38 +1359,36 @@ * hash tables. * * RETURNS - * TRUE if the hash table was created - * FALSE if the hash table could not be created - * - */ -static HASH_CACHEFILE_ENTRY *URLCache_CreateHashTable(LPURLCACHE_HEADER pHeader, HASH_CACHEFILE_ENTRY *pPrevHash) -{ - HASH_CACHEFILE_ENTRY *pHash; + * ERROR_SUCCESS if the hash table was created + * ERROR_DISK_FULL if the hash table could not be created + * + */ +static DWORD URLCache_CreateHashTable(LPURLCACHE_HEADER pHeader, HASH_CACHEFILE_ENTRY *pPrevHash, HASH_CACHEFILE_ENTRY **ppHash) +{ DWORD dwOffset; int i;
- if (!URLCache_FindFirstFreeEntry(pHeader, 0x20, (CACHEFILE_ENTRY **)&pHash)) + if (!URLCache_FindFirstFreeEntry(pHeader, 0x20, (CACHEFILE_ENTRY **)ppHash)) { FIXME("no free space for hash table\n"); - SetLastError(ERROR_DISK_FULL); - return NULL; - } - - dwOffset = (BYTE *)pHash - (BYTE *)pHeader; + return ERROR_DISK_FULL; + } + + dwOffset = (BYTE *)*ppHash - (BYTE *)pHeader;
if (pPrevHash) pPrevHash->dwAddressNext = dwOffset; else pHeader->dwOffsetFirstHashTable = dwOffset; - pHash->CacheFileEntry.dwSignature = HASH_SIGNATURE; - pHash->CacheFileEntry.dwBlocksUsed = 0x20; - pHash->dwHashTableNumber = pPrevHash ? pPrevHash->dwHashTableNumber + 1 : 0; + (*ppHash)->CacheFileEntry.dwSignature = HASH_SIGNATURE; + (*ppHash)->CacheFileEntry.dwBlocksUsed = 0x20; + (*ppHash)->dwHashTableNumber = pPrevHash ? pPrevHash->dwHashTableNumber + 1 : 0; for (i = 0; i < HASHTABLE_SIZE; i++) { - pHash->HashTable[i].dwOffsetEntry = 0; - pHash->HashTable[i].dwHashKey = HASHTABLE_FREE; - } - return pHash; + (*ppHash)->HashTable[i].dwOffsetEntry = 0; + (*ppHash)->HashTable[i].dwHashKey = HASHTABLE_FREE; + } + return ERROR_SUCCESS; }
/*********************************************************************** @@ -1488,14 +1501,23 @@ const CACHEFILE_ENTRY * pEntry; const URL_CACHEFILE_ENTRY * pUrlEntry; URLCACHECONTAINER * pContainer; + DWORD error;
TRACE("(%s, %p, %p)\n", debugstr_a(lpszUrlName), lpCacheEntryInfo, lpdwCacheEntryInfoBufferSize);
- if (!URLCacheContainers_FindContainerA(lpszUrlName, &pContainer)) - return FALSE; - - if (!URLCacheContainer_OpenIndex(pContainer)) - return FALSE; + error = URLCacheContainers_FindContainerA(lpszUrlName, &pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + } + + error = URLCacheContainer_OpenIndex(pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + }
if (!(pHeader = URLCacheContainer_LockIndex(pContainer))) return FALSE; @@ -1524,18 +1546,23 @@
if (lpdwCacheEntryInfoBufferSize) { - if (!URLCache_CopyEntry( + if (!lpCacheEntryInfo) + *lpdwCacheEntryInfoBufferSize = 0; + + error = URLCache_CopyEntry( pContainer, pHeader, lpCacheEntryInfo, lpdwCacheEntryInfoBufferSize, pUrlEntry, - FALSE /* ANSI */)) + FALSE /* ANSI */); + if (error != ERROR_SUCCESS) { URLCacheContainer_UnlockIndex(pContainer, pHeader); + SetLastError(error); return FALSE; } - TRACE("Local File Name: %s\n", debugstr_a(lpCacheEntryInfo->lpszLocalFileName)); + TRACE("Local File Name: %s\n", debugstr_a((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetLocalName)); }
URLCacheContainer_UnlockIndex(pContainer, pHeader); @@ -1556,14 +1583,23 @@ const CACHEFILE_ENTRY * pEntry; const URL_CACHEFILE_ENTRY * pUrlEntry; URLCACHECONTAINER * pContainer; + DWORD error;
TRACE("(%s, %p, %p)\n", debugstr_w(lpszUrl), lpCacheEntryInfo, lpdwCacheEntryInfoBufferSize);
- if (!URLCacheContainers_FindContainerW(lpszUrl, &pContainer)) - return FALSE; - - if (!URLCacheContainer_OpenIndex(pContainer)) - return FALSE; + error = URLCacheContainers_FindContainerW(lpszUrl, &pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + } + + error = URLCacheContainer_OpenIndex(pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + }
if (!(pHeader = URLCacheContainer_LockIndex(pContainer))) return FALSE; @@ -1591,18 +1627,23 @@
if (lpdwCacheEntryInfoBufferSize) { - if (!URLCache_CopyEntry( + if (!lpCacheEntryInfo) + *lpdwCacheEntryInfoBufferSize = 0; + + error = URLCache_CopyEntry( pContainer, pHeader, (LPINTERNET_CACHE_ENTRY_INFOA)lpCacheEntryInfo, lpdwCacheEntryInfoBufferSize, pUrlEntry, - TRUE /* UNICODE */)) + TRUE /* UNICODE */); + if (error != ERROR_SUCCESS) { URLCacheContainer_UnlockIndex(pContainer, pHeader); + SetLastError(error); return FALSE; } - TRACE("Local File Name: %s\n", debugstr_w(lpCacheEntryInfo->lpszLocalFileName)); + TRACE("Local File Name: %s\n", debugstr_a((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetLocalName)); }
URLCacheContainer_UnlockIndex(pContainer, pHeader); @@ -1657,14 +1698,23 @@ struct _HASH_ENTRY * pHashEntry; CACHEFILE_ENTRY * pEntry; URLCACHECONTAINER * pContainer; + DWORD error;
TRACE("(%s, %p, 0x%08x)\n", debugstr_a(lpszUrlName), lpCacheEntryInfo, dwFieldControl);
- if (!URLCacheContainers_FindContainerA(lpszUrlName, &pContainer)) - return FALSE; - - if (!URLCacheContainer_OpenIndex(pContainer)) - return FALSE; + error = URLCacheContainers_FindContainerA(lpszUrlName, &pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + } + + error = URLCacheContainer_OpenIndex(pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + }
if (!(pHeader = URLCacheContainer_LockIndex(pContainer))) return FALSE; @@ -1705,14 +1755,23 @@ struct _HASH_ENTRY * pHashEntry; CACHEFILE_ENTRY * pEntry; URLCACHECONTAINER * pContainer; + DWORD error;
TRACE("(%s, %p, 0x%08x)\n", debugstr_w(lpszUrl), lpCacheEntryInfo, dwFieldControl);
- if (!URLCacheContainers_FindContainerW(lpszUrl, &pContainer)) - return FALSE; - - if (!URLCacheContainer_OpenIndex(pContainer)) - return FALSE; + error = URLCacheContainers_FindContainerW(lpszUrl, &pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + } + + error = URLCacheContainer_OpenIndex(pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + }
if (!(pHeader = URLCacheContainer_LockIndex(pContainer))) return FALSE; @@ -1760,6 +1819,7 @@ CACHEFILE_ENTRY * pEntry; URL_CACHEFILE_ENTRY * pUrlEntry; URLCACHECONTAINER * pContainer; + DWORD error;
TRACE("(%s, %p, %p, 0x%08x)\n", debugstr_a(lpszUrlName), @@ -1767,11 +1827,26 @@ lpdwCacheEntryInfoBufferSize, dwReserved);
- if (!URLCacheContainers_FindContainerA(lpszUrlName, &pContainer)) - return FALSE; - - if (!URLCacheContainer_OpenIndex(pContainer)) - return FALSE; + if (!lpszUrlName || !lpdwCacheEntryInfoBufferSize || + (!lpCacheEntryInfo && *lpdwCacheEntryInfoBufferSize)) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + error = URLCacheContainers_FindContainerA(lpszUrlName, &pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + } + + error = URLCacheContainer_OpenIndex(pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + }
if (!(pHeader = URLCacheContainer_LockIndex(pContainer))) return FALSE; @@ -1801,12 +1876,16 @@ pUrlEntry->dwUseCount++; URLCache_HashEntrySetUse(pHashEntry, pUrlEntry->dwUseCount);
- if (!URLCache_CopyEntry(pContainer, pHeader, lpCacheEntryInfo, lpdwCacheEntryInfoBufferSize, pUrlEntry, FALSE)) + error = URLCache_CopyEntry(pContainer, pHeader, lpCacheEntryInfo, + lpdwCacheEntryInfoBufferSize, pUrlEntry, + FALSE); + if (error != ERROR_SUCCESS) { URLCacheContainer_UnlockIndex(pContainer, pHeader); - return FALSE; - } - TRACE("Local File Name: %s\n", lpCacheEntryInfo->lpszLocalFileName); + SetLastError(error); + return FALSE; + } + TRACE("Local File Name: %s\n", debugstr_a((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetLocalName));
URLCacheContainer_UnlockIndex(pContainer, pHeader);
@@ -1829,6 +1908,7 @@ CACHEFILE_ENTRY * pEntry; URL_CACHEFILE_ENTRY * pUrlEntry; URLCACHECONTAINER * pContainer; + DWORD error;
TRACE("(%s, %p, %p, 0x%08x)\n", debugstr_w(lpszUrlName), @@ -1836,11 +1916,26 @@ lpdwCacheEntryInfoBufferSize, dwReserved);
- if (!URLCacheContainers_FindContainerW(lpszUrlName, &pContainer)) - return FALSE; - - if (!URLCacheContainer_OpenIndex(pContainer)) - return FALSE; + if (!lpszUrlName || !lpdwCacheEntryInfoBufferSize || + (!lpCacheEntryInfo && *lpdwCacheEntryInfoBufferSize)) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + error = URLCacheContainers_FindContainerW(lpszUrlName, &pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + } + + error = URLCacheContainer_OpenIndex(pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + }
if (!(pHeader = URLCacheContainer_LockIndex(pContainer))) return FALSE; @@ -1870,18 +1965,20 @@ pUrlEntry->dwUseCount++; URLCache_HashEntrySetUse(pHashEntry, pUrlEntry->dwUseCount);
- if (!URLCache_CopyEntry( + error = URLCache_CopyEntry( pContainer, pHeader, (LPINTERNET_CACHE_ENTRY_INFOA)lpCacheEntryInfo, lpdwCacheEntryInfoBufferSize, pUrlEntry, - TRUE /* UNICODE */)) + TRUE /* UNICODE */); + if (error != ERROR_SUCCESS) { URLCacheContainer_UnlockIndex(pContainer, pHeader); - return FALSE; - } - TRACE("Local File Name: %s\n", debugstr_w(lpCacheEntryInfo->lpszLocalFileName)); + SetLastError(error); + return FALSE; + } + TRACE("Local File Name: %s\n", debugstr_a((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetLocalName));
URLCacheContainer_UnlockIndex(pContainer, pHeader);
@@ -1902,6 +1999,7 @@ CACHEFILE_ENTRY * pEntry; URL_CACHEFILE_ENTRY * pUrlEntry; URLCACHECONTAINER * pContainer; + DWORD error;
TRACE("(%s, 0x%08x)\n", debugstr_a(lpszUrlName), dwReserved);
@@ -1912,11 +2010,19 @@ return FALSE; }
- if (!URLCacheContainers_FindContainerA(lpszUrlName, &pContainer)) + error = URLCacheContainers_FindContainerA(lpszUrlName, &pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); return FALSE; - - if (!URLCacheContainer_OpenIndex(pContainer)) - return FALSE; + } + + error = URLCacheContainer_OpenIndex(pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + }
if (!(pHeader = URLCacheContainer_LockIndex(pContainer))) return FALSE; @@ -1964,6 +2070,7 @@ CACHEFILE_ENTRY * pEntry; URL_CACHEFILE_ENTRY * pUrlEntry; URLCACHECONTAINER * pContainer; + DWORD error;
TRACE("(%s, 0x%08x)\n", debugstr_w(lpszUrlName), dwReserved);
@@ -1974,11 +2081,19 @@ return FALSE; }
- if (!URLCacheContainers_FindContainerW(lpszUrlName, &pContainer)) - return FALSE; - - if (!URLCacheContainer_OpenIndex(pContainer)) - return FALSE; + error = URLCacheContainers_FindContainerW(lpszUrlName, &pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + } + + error = URLCacheContainer_OpenIndex(pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + }
if (!(pHeader = URLCacheContainer_LockIndex(pContainer))) return FALSE; @@ -2095,6 +2210,7 @@ LONG lBufferSize; BOOL bFound = FALSE; int count; + DWORD error; static const WCHAR szWWW[] = {'w','w','w',0};
TRACE("(%s, 0x%08x, %s, %p, 0x%08x)\n", @@ -2144,6 +2260,8 @@ if (!len) return FALSE; szFile[len] = '\0'; + while(len && szFile[--len] == '/') szFile[len] = '\0'; + /* FIXME: get rid of illegal characters like , / and : */ } else @@ -2153,11 +2271,19 @@
TRACE("File name: %s\n", debugstr_a(szFile));
- if (!URLCacheContainers_FindContainerW(lpszUrlName, &pContainer)) - return FALSE; - - if (!URLCacheContainer_OpenIndex(pContainer)) - return FALSE; + error = URLCacheContainers_FindContainerW(lpszUrlName, &pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + } + + error = URLCacheContainer_OpenIndex(pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + }
if (!(pHeader = URLCacheContainer_LockIndex(pContainer))) return FALSE; @@ -2191,9 +2317,26 @@
for (i = 0; i < 255; i++) { - static const WCHAR szFormat[] = {'[','%','u',']','%','s',0}; + static const WCHAR szFormat[] = {'[','%','u',']','%','s',0}; HANDLE hFile; + WCHAR *p; + wsprintfW(lpszFileNameNoPath + countnoextension, szFormat, i, szExtension); + for (p = lpszFileNameNoPath + 1; *p; p++) + { + switch (*p) + { + case '<': case '>': + case ':': case '"': + case '/': case '\': + case '|': case '?': + case '*': + *p = '_'; break; + default: break; + } + } + if (p[-1] == ' ' || p[-1] == '.') p[-1] = '_'; + TRACE("Trying: %s\n", debugstr_w(lpszFileName)); hFile = CreateFileW(lpszFileName, GENERIC_READ, 0, NULL, CREATE_NEW, 0, NULL); if (hFile != INVALID_HANDLE_VALUE) @@ -2221,7 +2364,7 @@ * result will lose data for arbitrary binary data. * */ -static BOOL WINAPI CommitUrlCacheEntryInternal( +static BOOL CommitUrlCacheEntryInternal( IN LPCWSTR lpszUrlName, IN LPCWSTR lpszLocalFileName, IN FILETIME ExpireTime, @@ -2250,7 +2393,7 @@ LPSTR lpszUrlNameA = NULL; LPSTR lpszFileExtensionA = NULL; char *pchLocalFileName = 0; - DWORD error = ERROR_SUCCESS; + DWORD error;
TRACE("(%s, %s, ..., ..., %x, %p, %d, %s, %s)\n", debugstr_w(lpszUrlName), @@ -2287,11 +2430,19 @@ CloseHandle(hFile); }
- if (!URLCacheContainers_FindContainerW(lpszUrlName, &pContainer)) - return FALSE; - - if (!URLCacheContainer_OpenIndex(pContainer)) - return FALSE; + error = URLCacheContainers_FindContainerW(lpszUrlName, &pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + } + + error = URLCacheContainer_OpenIndex(pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + }
if (!(pHeader = URLCacheContainer_LockIndex(pContainer))) return FALSE; @@ -2436,13 +2587,10 @@ if (dwOffsetFileExtension) strcpy((LPSTR)((LPBYTE)pUrlEntry + dwOffsetFileExtension), lpszFileExtensionA);
- if (!URLCache_AddEntryToHash(pHeader, lpszUrlNameA, (DWORD)((LPBYTE)pUrlEntry - (LPBYTE)pHeader))) - { + error = URLCache_AddEntryToHash(pHeader, lpszUrlNameA, + (DWORD)((LPBYTE)pUrlEntry - (LPBYTE)pHeader)); + if (error != ERROR_SUCCESS) URLCache_DeleteEntry(pHeader, &pUrlEntry->CacheFileEntry); - URLCacheContainer_UnlockIndex(pContainer, pHeader); - HeapFree(GetProcessHeap(), 0, lpszUrlNameA); - return FALSE; - }
cleanup: URLCacheContainer_UnlockIndex(pContainer, pHeader); @@ -2675,7 +2823,7 @@
pStream->hFile = hFile; strcpy(pStream->lpszUrl, lpszUrlName); - return (HANDLE)pStream; + return pStream; }
/*********************************************************************** @@ -2742,14 +2890,23 @@ LPURLCACHE_HEADER pHeader; struct _HASH_ENTRY * pHashEntry; CACHEFILE_ENTRY * pEntry; + DWORD error;
TRACE("(%s)\n", debugstr_a(lpszUrlName));
- if (!URLCacheContainers_FindContainerA(lpszUrlName, &pContainer)) - return FALSE; - - if (!URLCacheContainer_OpenIndex(pContainer)) - return FALSE; + error = URLCacheContainers_FindContainerA(lpszUrlName, &pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + } + + error = URLCacheContainer_OpenIndex(pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + }
if (!(pHeader = URLCacheContainer_LockIndex(pContainer))) return FALSE; @@ -2784,6 +2941,7 @@ CACHEFILE_ENTRY * pEntry; LPSTR urlA; int url_len; + DWORD error;
TRACE("(%s)\n", debugstr_w(lpszUrlName));
@@ -2796,16 +2954,22 @@ } WideCharToMultiByte(CP_ACP, 0, lpszUrlName, -1, urlA, url_len, NULL, NULL);
- if (!URLCacheContainers_FindContainerW(lpszUrlName, &pContainer)) + error = URLCacheContainers_FindContainerW(lpszUrlName, &pContainer); + if (error != ERROR_SUCCESS) { HeapFree(GetProcessHeap(), 0, urlA); - return FALSE; - } - if (!URLCacheContainer_OpenIndex(pContainer)) + SetLastError(error); + return FALSE; + } + + error = URLCacheContainer_OpenIndex(pContainer); + if (error != ERROR_SUCCESS) { HeapFree(GetProcessHeap(), 0, urlA); - return FALSE; - } + SetLastError(error); + return FALSE; + } + if (!(pHeader = URLCacheContainer_LockIndex(pContainer))) { HeapFree(GetProcessHeap(), 0, urlA); @@ -3057,9 +3221,14 @@ { LPURLCACHE_HEADER pHeader; HASH_CACHEFILE_ENTRY *pHashTableEntry; - - if (!URLCacheContainer_OpenIndex(pContainer)) + DWORD error; + + error = URLCacheContainer_OpenIndex(pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); return FALSE; + }
if (!(pHeader = URLCacheContainer_LockIndex(pContainer))) return FALSE; @@ -3081,18 +3250,20 @@ TRACE("Found URL: %s\n", (LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl); TRACE("Header info: %s\n", (LPBYTE)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo);
- if (!URLCache_CopyEntry( + error = URLCache_CopyEntry( pContainer, pHeader, lpNextCacheEntryInfo, lpdwNextCacheEntryInfoBufferSize, pUrlEntry, - FALSE /* not UNICODE */)) + FALSE /* not UNICODE */); + if (error != ERROR_SUCCESS) { URLCacheContainer_UnlockIndex(pContainer, pHeader); + SetLastError(error); return FALSE; } - TRACE("Local File Name: %s\n", debugstr_a(lpNextCacheEntryInfo->lpszLocalFileName)); + TRACE("Local File Name: %s\n", debugstr_a((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetLocalName));
/* increment the current index so that next time the function * is called the next entry is returned */ @@ -3109,6 +3280,9 @@ return FALSE; }
+/*********************************************************************** + * FindNextUrlCacheEntryW (WININET.@) + */ BOOL WINAPI FindNextUrlCacheEntryW( HANDLE hEnumHandle, LPINTERNET_CACHE_ENTRY_INFOW lpNextCacheEntryInfo, @@ -3337,14 +3511,23 @@ const CACHEFILE_ENTRY * pEntry; const URL_CACHEFILE_ENTRY * pUrlEntry; URLCACHECONTAINER * pContainer; + DWORD error;
TRACE("(%s, %08x, %p)\n", debugstr_a(url), dwFlags, pftLastModified);
- if (!URLCacheContainers_FindContainerA(url, &pContainer)) - return FALSE; - - if (!URLCacheContainer_OpenIndex(pContainer)) - return FALSE; + error = URLCacheContainers_FindContainerA(url, &pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + } + + error = URLCacheContainer_OpenIndex(pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + }
if (!(pHeader = URLCacheContainer_LockIndex(pContainer))) return FALSE; @@ -3390,14 +3573,23 @@ const CACHEFILE_ENTRY * pEntry; const URL_CACHEFILE_ENTRY * pUrlEntry; URLCACHECONTAINER * pContainer; + DWORD error;
TRACE("(%s, %08x, %p)\n", debugstr_w(url), dwFlags, pftLastModified);
- if (!URLCacheContainers_FindContainerW(url, &pContainer)) - return FALSE; - - if (!URLCacheContainer_OpenIndex(pContainer)) - return FALSE; + error = URLCacheContainers_FindContainerW(url, &pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + } + + error = URLCacheContainer_OpenIndex(pContainer); + if (error != ERROR_SUCCESS) + { + SetLastError(error); + return FALSE; + }
if (!(pHeader = URLCacheContainer_LockIndex(pContainer))) return FALSE; @@ -3427,3 +3619,21 @@
return TRUE; } + +/*********************************************************************** + * GetDiskInfoA (WININET.@) + */ +DWORD WINAPI GetDiskInfoA(void *p0, void *p1, void *p2, void *p3) +{ + FIXME("(%p, %p, %p, %p)\n", p0, p1, p2, p3); + return 0; +} + +/*********************************************************************** + * RegisterUrlCacheNotification (WININET.@) + */ +DWORD WINAPI RegisterUrlCacheNotification(LPVOID a, DWORD b, DWORD c, DWORD d, DWORD e, DWORD f) +{ + FIXME("(%p %x %x %x %x %x)\n", a, b, c, d, e, f); + return 0; +}