Piotr Caban : wininet: Don't delete locked entry in DeleteUrlCacheEntry.

Alexandre Julliard julliard at winehq.org
Fri Apr 6 14:43:23 CDT 2012


Module: wine
Branch: master
Commit: d1ecb6d9ba1f11eba0a2b832369af225ddee4151
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d1ecb6d9ba1f11eba0a2b832369af225ddee4151

Author: Piotr Caban <piotr at 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);
 




More information about the wine-cvs mailing list