summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/hookapi.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/hookapi.cc')
-rw-r--r--winsup/cygwin/hookapi.cc22
1 files changed, 14 insertions, 8 deletions
diff --git a/winsup/cygwin/hookapi.cc b/winsup/cygwin/hookapi.cc
index ba9d55112..8a9a2bfdd 100644
--- a/winsup/cygwin/hookapi.cc
+++ b/winsup/cygwin/hookapi.cc
@@ -165,7 +165,8 @@ makename (const char *name, char *&buf, int& i, int inc)
/* Find first missing dll in a given executable.
FIXME: This is not foolproof since it doesn't look for dlls in the
same directory as the given executable, like Windows. Instead it
- searches for dlls in the context of the current executable. */
+ searches for dlls in the context of the current executable.
+ It also only finds direct dependencies, not indirect ones. */
const char *
find_first_notloaded_dll (path_conv& pc)
{
@@ -226,32 +227,37 @@ find_first_notloaded_dll (path_conv& pc)
importRVA -= delta;
DWORD offset = 0;
- char *map = NULL;
+ HMODULE map = NULL;
if (importRVA + importRVAMaxSize > wincap.allocation_granularity ())
{
offset = rounddown (importRVA, wincap.allocation_granularity ());
DWORD size = importRVA - offset + importRVAMaxSize;
- map = (char *) MapViewOfFile (hc, FILE_MAP_READ, 0, offset, size);
+ map = (HMODULE) MapViewOfFile (hc, FILE_MAP_READ, 0,
+ offset, size);
if (!map)
goto out;
}
// Convert imports RVA to a usable pointer
PIMAGE_IMPORT_DESCRIPTOR pdfirst;
- pdfirst = rva (PIMAGE_IMPORT_DESCRIPTOR, hm, importRVA - offset);
+ pdfirst = rva (PIMAGE_IMPORT_DESCRIPTOR, map ?: hm,
+ importRVA - offset);
// Iterate through each import descriptor, and redirect if appropriate
for (PIMAGE_IMPORT_DESCRIPTOR pd = pdfirst; pd->FirstThunk; pd++)
{
- const char *lib = rva (PSTR, hm, pd->Name - delta - offset);
+ const char *lib = rva (PSTR, map ?: hm,
+ pd->Name - delta - offset);
if (!LoadLibraryEx (lib, NULL, DONT_RESOLVE_DLL_REFERENCES
| LOAD_LIBRARY_AS_DATAFILE))
{
- static char buf[NT_MAX_PATH];
- res = strcpy (buf, lib);
+ static char buf[MAX_PATH];
+ strlcpy (buf, lib, MAX_PATH);
+ res = buf;
}
}
- UnmapViewOfFile (map);
+ if (map)
+ UnmapViewOfFile (map);
}
}