* hookapi.cc (find_first_notloaded_dll): Extend comment. Fix usage of

mapped memory.  Shorten static library name buffer to MAX_PATH.  Use
	strlcpy to copy library name to buffer.  Only Unmap "map" if it has been
	Mapped before.
	* pinfo.cc (status_exit): Drop unneeded declaration of
	find_first_notloaded_dll in favor of the declaration in winsup.h.
This commit is contained in:
Corinna Vinschen 2012-05-30 14:37:53 +00:00
parent 52174bb4cc
commit 0b592aeef2
3 changed files with 23 additions and 9 deletions

View File

@ -1,3 +1,12 @@
2012-05-30 Corinna Vinschen <corinna@vinschen.de>
* hookapi.cc (find_first_notloaded_dll): Extend comment. Fix usage of
mapped memory. Shorten static library name buffer to MAX_PATH. Use
strlcpy to copy library name to buffer. Only Unmap "map" if it has been
Mapped before.
* pinfo.cc (status_exit): Drop unneeded declaration of
find_first_notloaded_dll in favor of the declaration in winsup.h.
2012-05-30 Corinna Vinschen <corinna@vinschen.de>
* thread.cc: Remove temporary newlib workaround, now that newlib

View File

@ -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,31 +227,36 @@ 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;
}
}
if (map)
UnmapViewOfFile (map);
}
}

View File

@ -114,7 +114,6 @@ pinfo_init (char **envp, int envc)
static DWORD
status_exit (DWORD x)
{
const char *find_first_notloaded_dll (path_conv &);
switch (x)
{
case STATUS_DLL_NOT_FOUND: