Fix memory leaks and infinite loops in the Win32 launcher.
This commit is contained in:
parent
abd4c9df92
commit
01765e2aef
34
src/zzuf.c
34
src/zzuf.c
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
/* We’re the parent, acknowledge spawn */
|
/* We’re 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
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user