Module: wine Branch: master Commit: d1ecb6d9ba1f11eba0a2b832369af225ddee4151 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d1ecb6d9ba1f11eba0a2b83236...
Author: Piotr Caban piotr@codeweavers.com Date: Thu Apr 5 21:34:35 2012 +0200
wininet: Don't delete locked entry in DeleteUrlCacheEntry.
---
dlls/wininet/tests/urlcache.c | 5 ----- dlls/wininet/urlcache.c | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/dlls/wininet/tests/urlcache.c b/dlls/wininet/tests/urlcache.c index 3b4627c..93ad333 100644 --- a/dlls/wininet/tests/urlcache.c +++ b/dlls/wininet/tests/urlcache.c @@ -571,9 +571,7 @@ static void test_urlcacheA(void) if (pDeleteUrlCacheEntryA) { ret = pDeleteUrlCacheEntryA(TEST_URL); - todo_wine ok(!ret, "Expected failure\n"); - todo_wine ok(GetLastError() == ERROR_SHARING_VIOLATION, "Expected ERROR_SHARING_VIOLATION, got %d\n", GetLastError()); check_file_exists(filenameA); @@ -582,9 +580,7 @@ static void test_urlcacheA(void) lpCacheEntryInfo = HeapAlloc(GetProcessHeap(), 0, cbCacheEntryInfo); memset(lpCacheEntryInfo, 0, cbCacheEntryInfo); ret = GetUrlCacheEntryInfo(TEST_URL, lpCacheEntryInfo, &cbCacheEntryInfo); - todo_wine ok(ret, "GetUrlCacheEntryInfo failed with error %d\n", GetLastError()); - todo_wine ok(lpCacheEntryInfo->CacheEntryType & DELETED_CACHE_ENTRY, "CacheEntryType hasn't DELETED_CACHE_ENTRY set, (flags %08x)\n", lpCacheEntryInfo->CacheEntryType); @@ -594,7 +590,6 @@ static void test_urlcacheA(void) { check_file_exists(filenameA); ret = pUnlockUrlCacheEntryFileA(TEST_URL, 0); - todo_wine ok(ret, "UnlockUrlCacheEntryFileA failed: %d\n", GetLastError()); /* By unlocking the already-deleted cache entry, the file associated * with it is deleted.. diff --git a/dlls/wininet/urlcache.c b/dlls/wininet/urlcache.c index fb9e701..f4a47b1 100644 --- a/dlls/wininet/urlcache.c +++ b/dlls/wininet/urlcache.c @@ -2139,7 +2139,17 @@ static BOOL DeleteUrlCacheEntryInternal(LPURLCACHE_HEADER pHeader, SetLastError(ERROR_FILE_NOT_FOUND); return FALSE; } + pUrlEntry = (URL_CACHEFILE_ENTRY *)pEntry; + if ((pHashEntry->dwHashKey & ((1<<HASHTABLE_FLAG_BITS)-1)) == HASHTABLE_LOCK) + { + /* FIXME: implement timeout object unlocking */ + TRACE("Trying to delete locked entry\n"); + pUrlEntry->CacheEntryType |= DELETED_CACHE_ENTRY; + SetLastError(ERROR_SHARING_VIOLATION); + return FALSE; + } + if (pUrlEntry->CacheDir < pHeader->DirectoryCount) { if (pHeader->directory_data[pUrlEntry->CacheDir].dwNumFiles) @@ -2234,7 +2244,11 @@ BOOL WINAPI UnlockUrlCacheEntryFileA( } pUrlEntry->dwUseCount--; if (!pUrlEntry->dwUseCount) + { URLCache_HashEntrySetFlags(pHashEntry, HASHTABLE_URL); + if (pUrlEntry->CacheEntryType & DELETED_CACHE_ENTRY) + DeleteUrlCacheEntryInternal(pHeader, pHashEntry); + }
URLCacheContainer_UnlockIndex(pContainer, pHeader);