Rob Shearman : wininet: Validate parameters passed to RetrieveUrlCacheEntryInfoA/W.

Alexandre Julliard julliard at winehq.org
Wed Oct 8 08:32:32 CDT 2008


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

Author: Rob Shearman <robertshearman at gmail.com>
Date:   Tue Oct  7 15:39:33 2008 +0100

wininet: Validate parameters passed to RetrieveUrlCacheEntryInfoA/W.

Add tests for this.

---

 dlls/wininet/tests/urlcache.c |   25 +++++++++++++++++++++++++
 dlls/wininet/urlcache.c       |   14 ++++++++++++++
 2 files changed, 39 insertions(+), 0 deletions(-)

diff --git a/dlls/wininet/tests/urlcache.c b/dlls/wininet/tests/urlcache.c
index d264b91..44852f7 100644
--- a/dlls/wininet/tests/urlcache.c
+++ b/dlls/wininet/tests/urlcache.c
@@ -113,6 +113,7 @@ static void test_GetUrlCacheEntryInfoExA(void)
     check_cache_entry_infoA("GetUrlCacheEntryInfoEx", lpCacheEntryInfo);
 
     cbCacheEntryInfo = 100000;
+    SetLastError(0xdeadbeef);
     ret = GetUrlCacheEntryInfoEx(TEST_URL, NULL, &cbCacheEntryInfo, NULL, NULL, NULL, 0);
     ok(!ret, "GetUrlCacheEntryInfoEx with zero-length buffer should fail\n");
     ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "GetUrlCacheEntryInfoEx should have set last error to ERROR_INSUFFICIENT_BUFFER instead of %d\n", GetLastError());
@@ -120,6 +121,29 @@ static void test_GetUrlCacheEntryInfoExA(void)
     HeapFree(GetProcessHeap(), 0, lpCacheEntryInfo);
 }
 
+static void test_RetrieveUrlCacheEntryA(void)
+{
+    BOOL ret;
+    DWORD cbCacheEntryInfo;
+
+    cbCacheEntryInfo = 0;
+    SetLastError(0xdeadbeef);
+    ret = RetrieveUrlCacheEntryFile(NULL, NULL, &cbCacheEntryInfo, 0);
+    ok(!ret, "RetrieveUrlCacheEntryFile should have failed\n");
+    ok(GetLastError() == ERROR_INVALID_PARAMETER, "RetrieveUrlCacheEntryFile should have set last error to ERROR_INVALID_PARAMETER instead of %d\n", GetLastError());
+
+    SetLastError(0xdeadbeef);
+    ret = RetrieveUrlCacheEntryFile(TEST_URL, NULL, NULL, 0);
+    ok(!ret, "RetrieveUrlCacheEntryFile should have failed\n");
+    ok(GetLastError() == ERROR_INVALID_PARAMETER, "RetrieveUrlCacheEntryFile should have set last error to ERROR_INVALID_PARAMETER instead of %d\n", GetLastError());
+
+    SetLastError(0xdeadbeef);
+    cbCacheEntryInfo = 100000;
+    ret = RetrieveUrlCacheEntryFile(NULL, NULL, &cbCacheEntryInfo, 0);
+    ok(!ret, "RetrieveUrlCacheEntryFile should have failed\n");
+    ok(GetLastError() == ERROR_INVALID_PARAMETER, "RetrieveUrlCacheEntryFile should have set last error to ERROR_INVALID_PARAMETER instead of %d\n", GetLastError());
+}
+
 static void test_urlcacheA(void)
 {
     BOOL ret;
@@ -168,6 +192,7 @@ static void test_urlcacheA(void)
     test_find_url_cache_entriesA();
 
     test_GetUrlCacheEntryInfoExA();
+    test_RetrieveUrlCacheEntryA();
 
     if (pDeleteUrlCacheEntryA)
     {
diff --git a/dlls/wininet/urlcache.c b/dlls/wininet/urlcache.c
index 792c7bc..9705769 100644
--- a/dlls/wininet/urlcache.c
+++ b/dlls/wininet/urlcache.c
@@ -1817,6 +1817,13 @@ BOOL WINAPI RetrieveUrlCacheEntryFileA(
         lpdwCacheEntryInfoBufferSize,
         dwReserved);
 
+    if (!lpszUrlName || !lpdwCacheEntryInfoBufferSize ||
+        (!lpCacheEntryInfo && *lpdwCacheEntryInfoBufferSize))
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
     error = URLCacheContainers_FindContainerA(lpszUrlName, &pContainer);
     if (error != ERROR_SUCCESS)
     {
@@ -1899,6 +1906,13 @@ BOOL WINAPI RetrieveUrlCacheEntryFileW(
         lpdwCacheEntryInfoBufferSize,
         dwReserved);
 
+    if (!lpszUrlName || !lpdwCacheEntryInfoBufferSize ||
+        (!lpCacheEntryInfo && *lpdwCacheEntryInfoBufferSize))
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
     error = URLCacheContainers_FindContainerW(lpszUrlName, &pContainer);
     if (error != ERROR_SUCCESS)
     {




More information about the wine-cvs mailing list