Hans Leidekker : mpr: Fix buffer size calculation in WNetGetUniversalNameW.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Mar 26 08:12:47 CDT 2007


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

Author: Hans Leidekker <hans at it.vu.nl>
Date:   Sat Mar 24 17:32:02 2007 +0100

mpr: Fix buffer size calculation in WNetGetUniversalNameW.

---

 dlls/mpr/wnet.c |   24 ++++++++++++++----------
 1 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/dlls/mpr/wnet.c b/dlls/mpr/wnet.c
index f20e318..7419258 100644
--- a/dlls/mpr/wnet.c
+++ b/dlls/mpr/wnet.c
@@ -1713,8 +1713,7 @@ DWORD WINAPI WNetGetUniversalNameA ( LPCSTR lpLocalPath, DWORD dwInfoLevel,
 DWORD WINAPI WNetGetUniversalNameW ( LPCWSTR lpLocalPath, DWORD dwInfoLevel,
                                      LPVOID lpBuffer, LPDWORD lpBufferSize )
 {
-    LPUNIVERSAL_NAME_INFOW uniw;
-    DWORD err, len;
+    DWORD err, size;
 
     FIXME( "(%s, 0x%08X, %p, %p): stub\n",
            debugstr_w(lpLocalPath), dwInfoLevel, lpBuffer, lpBufferSize);
@@ -1722,23 +1721,28 @@ DWORD WINAPI WNetGetUniversalNameW ( LPCWSTR lpLocalPath, DWORD dwInfoLevel,
     switch (dwInfoLevel)
     {
     case UNIVERSAL_NAME_INFO_LEVEL:
-        err = WN_MORE_DATA;
-        len = sizeof (*uniw) + lstrlenW(lpLocalPath);
-        if (*lpBufferSize <= len)
+    {
+        LPUNIVERSAL_NAME_INFOW info = (LPUNIVERSAL_NAME_INFOW)lpBuffer;
+
+        size = sizeof(*info) + (lstrlenW(lpLocalPath) + 1) * sizeof(WCHAR);
+        if (*lpBufferSize < size)
+        {
+            err = WN_MORE_DATA;
             break;
-        uniw = lpBuffer;
-        uniw->lpUniversalName = (LPWSTR) &uniw[1];
-        lstrcpyW(uniw->lpUniversalName, lpLocalPath);
-        *lpBufferSize = len;
+        }
+        info->lpUniversalName = (LPWSTR)((char *)info + sizeof(*info));
+        lstrcpyW(info->lpUniversalName, lpLocalPath);
+        *lpBufferSize = size;
         err = WN_NO_ERROR;
         break;
-
+    }
     case REMOTE_NAME_INFO_LEVEL:
         err = WN_NO_NETWORK;
         break;
 
     default:
         err = WN_BAD_VALUE;
+        break;
     }
 
     SetLastError(err);




More information about the wine-cvs mailing list