kernel32: Reset LastError if GetModuleFileName() succeeds.

Francois Gouget fgouget at codeweavers.com
Mon Oct 3 16:38:29 CDT 2011


This is necessary because LastError may already be set to ERROR_INSUFFICIENT_BUFFER which would mislead the caller.
---

Older versions of Windows don't do it (before ~ Windows XP SP3), but 
doing it just makes sense.

 dlls/kernel32/module.c       |    3 +++
 dlls/kernel32/tests/module.c |    8 ++++++++
 2 files changed, 11 insertions(+), 0 deletions(-)

diff --git a/dlls/kernel32/module.c b/dlls/kernel32/module.c
index 8ee0fcd..1b0b23f 100644
--- a/dlls/kernel32/module.c
+++ b/dlls/kernel32/module.c
@@ -648,7 +648,10 @@ DWORD WINAPI GetModuleFileNameW( HMODULE hModule, LPWSTR lpFileName, DWORD size
         len = min(size, pldr->FullDllName.Length / sizeof(WCHAR));
         memcpy(lpFileName, pldr->FullDllName.Buffer, len * sizeof(WCHAR));
         if (len < size)
+        {
             lpFileName[len] = '\0';
+            SetLastError( 0 );
+        }
         else
             SetLastError( ERROR_INSUFFICIENT_BUFFER );
     }
diff --git a/dlls/kernel32/tests/module.c b/dlls/kernel32/tests/module.c
index 01fa448..07d5892 100644
--- a/dlls/kernel32/tests/module.c
+++ b/dlls/kernel32/tests/module.c
@@ -44,13 +44,21 @@ static void testGetModuleFileName(const char* name)
 
     /* first test, with enough space in buffer */
     memset(bufA, '-', sizeof(bufA));
+    SetLastError(0xdeadbeef);
     len1A = GetModuleFileNameA(hMod, bufA, sizeof(bufA));
+    ok(GetLastError() == ERROR_SUCCESS ||
+       broken(GetLastError() == 0xdeadbeef), /* <= XP SP3 */
+       "LastError was not reset: %u\n", GetLastError());
     ok(len1A > 0, "Getting module filename for handle %p\n", hMod);
 
     if (is_unicode_enabled)
     {
         memset(bufW, '-', sizeof(bufW));
+        SetLastError(0xdeadbeef);
         len1W = GetModuleFileNameW(hMod, bufW, sizeof(bufW) / sizeof(WCHAR));
+        ok(GetLastError() == ERROR_SUCCESS ||
+           broken(GetLastError() == 0xdeadbeef), /* <= XP SP3 */
+           "LastError was not reset: %u\n", GetLastError());
         ok(len1W > 0, "Getting module filename for handle %p\n", hMod);
     }
 
-- 
1.7.6.3




More information about the wine-patches mailing list