Fix memory leaks and infinite loops in the Win32 launcher.

This commit is contained in:
Sam Hocevar 2009-12-07 18:34:21 +00:00 committed by sam
parent abd4c9df92
commit 01765e2aef

View File

@ -689,13 +689,18 @@ static void spawn_children(struct opts *opts)
if(ret < 0) if(ret < 0)
{ {
perror("pipe"); perror("pipe");
opts->seed++;
return; return;
} }
} }
pid = run_process(opts, pipes); pid = run_process(opts, pipes);
if(pid < 0) if(pid < 0)
{
fprintf(stderr, "error launching `%s'\n", opts->newargv[0]);
opts->seed++;
return; return;
}
/* Were the parent, acknowledge spawn */ /* Were the parent, acknowledge spawn */
opts->child[i].date = now; opts->child[i].date = now;
@ -1174,18 +1179,18 @@ static void *get_entry(char const *name)
{ {
PIMAGE_DOS_HEADER dos; PIMAGE_DOS_HEADER dos;
PIMAGE_NT_HEADERS nt; PIMAGE_NT_HEADERS nt;
void *file, *map, *base; void *file, *map, *base, *ret = NULL;
file = CreateFile(name, GENERIC_READ, FILE_SHARE_READ, file = CreateFile(name, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, NULL); NULL, OPEN_EXISTING, 0, NULL);
if(file == INVALID_HANDLE_VALUE) if(file == INVALID_HANDLE_VALUE)
return NULL; return ret;
map = CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL); map = CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL);
if(!map) if(!map)
{ {
CloseHandle(file); CloseHandle(file);
return NULL; return ret;
} }
base = MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0); base = MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0);
@ -1193,25 +1198,26 @@ static void *get_entry(char const *name)
{ {
CloseHandle(map); CloseHandle(map);
CloseHandle(file); CloseHandle(file);
return NULL; return ret;
} }
/* Sanity checks */ /* Sanity checks */
dos = (PIMAGE_DOS_HEADER)base; dos = (PIMAGE_DOS_HEADER)base;
nt = (PIMAGE_NT_HEADERS)((char *)base + dos->e_lfanew); nt = (PIMAGE_NT_HEADERS)((char *)base + dos->e_lfanew);
if(dos->e_magic != IMAGE_DOS_SIGNATURE if(dos->e_magic == IMAGE_DOS_SIGNATURE /* 0x5A4D */
|| nt->Signature != IMAGE_NT_SIGNATURE && nt->Signature == IMAGE_NT_SIGNATURE /* 0x00004550 */
|| nt->FileHeader.Machine != IMAGE_FILE_MACHINE_I386 && nt->FileHeader.Machine == IMAGE_FILE_MACHINE_I386
|| nt->OptionalHeader.Magic != 0x10b /* IMAGE_NT_OPTIONAL_HDR32_MAGIC */) && nt->OptionalHeader.Magic == 0x10b /* IMAGE_NT_OPTIONAL_HDR32_MAGIC */)
{ {
UnmapViewOfFile(base); ret = (void *)(uintptr_t)(nt->OptionalHeader.ImageBase +
CloseHandle(map); nt->OptionalHeader.AddressOfEntryPoint);
CloseHandle(file);
return NULL;
} }
return (void *)(uintptr_t)(nt->OptionalHeader.ImageBase + UnmapViewOfFile(base);
nt->OptionalHeader.AddressOfEntryPoint); CloseHandle(map);
CloseHandle(file);
return ret;
} }
#endif #endif