Fix lossage due to pathname truncation in calls to MODULE_LoadLibraryExA

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Recently I've been using WINE to run a Win32 exe which needs to load certain 
DLLs which are located in the same directory as the exe. I was most perplexed 
when I found that this worked initially, but when I moved the exe and DLLs to 
a different directory it stopped working ie WINE would refuse to start the 
exe, claiming that it was unable to load the required DLLs.

After some debugging, I discovered that the critical factor was the length of 
the pathname to the exe, when it passed a certain length it stopped working. 
However this length was way short of the MAX_PATH value of 260.

More investigation showed that in DIR_TryModulePath the path name that was 
being built for the DLL was being limited to OFS_MAXPATHNAME, which clearly 
was too short for the pathname of the module in question, and judging by the 
comment was a holdover from pre-Win32 WINE code. So switched to using 
MAX_PATH instead of OFS_MAXPATHNAME to size the name buffers in 
DIR_TryModulePath, and the problem I was seeing went away.

I can't state with 100% certainty that there isn't some problem with this 
change that I have overlooked (this is my first bit of spelunking in the WINE 
source after all), but to the best of my knowledge it is ok.

Regards
M.Beach
? DIR_TryModulePath-patch.diff
Index: files/directory.c
===================================================================
RCS file: /home/wine/wine/files/directory.c,v
retrieving revision 1.51
diff -u -r1.51 directory.c
--- files/directory.c	27 Aug 2002 01:13:59 -0000	1.51
+++ files/directory.c	12 Sep 2002 10:16:55 -0000
@@ -716,9 +716,7 @@
  */
 static BOOL DIR_TryModulePath( LPCWSTR name, DOS_FULL_NAME *full_name, BOOL win32 )
 {
-    /* FIXME: for now, GetModuleFileNameW can't return more */
-    /* than OFS_MAXPATHNAME. This may change with Win32. */
-    WCHAR bufferW[OFS_MAXPATHNAME];
+    WCHAR bufferW[MAX_PATH];
     LPWSTR p;
 
     if (!win32)
@@ -727,13 +725,13 @@
 	if (!GetCurrentTask()) return FALSE;
 	if (!GetModuleFileName16( GetCurrentTask(), buffer, sizeof(buffer) ))
             return FALSE;
-        MultiByteToWideChar(CP_ACP, 0, buffer, -1, bufferW, OFS_MAXPATHNAME);
+        MultiByteToWideChar(CP_ACP, 0, buffer, -1, bufferW, MAX_PATH);
     } else {
-	if (!GetModuleFileNameW( 0, bufferW, OFS_MAXPATHNAME ) )
+	if (!GetModuleFileNameW( 0, bufferW, MAX_PATH ) )
             return FALSE;
     }
     if (!(p = strrchrW( bufferW, '\\' ))) return FALSE;
-    if (OFS_MAXPATHNAME - (++p - bufferW) <= strlenW(name)) return FALSE;
+    if (MAX_PATH - (++p - bufferW) <= strlenW(name)) return FALSE;
     strcpyW( p, name );
     return DOSFS_GetFullName( bufferW, TRUE, full_name );
 }

[Index of Archives]     [Gimp for Windows]     [Red Hat]     [Samba]     [Yosemite Camping]     [Graphics Cards]     [Wine Home]

  Powered by Linux