Fix potential hang in ldd if DLL encounters missing entry point

* ldd.cc (STATUS_DLL_NOT_FOUND): Drop definition.
        (report): Handle STATUS_ENTRYPOINT_NOT_FOUND exception.  Explain why.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2015-07-20 18:32:24 +02:00
parent e437a7d826
commit 23ad79d7de
2 changed files with 11 additions and 4 deletions

View File

@ -1,3 +1,8 @@
2015-07-20 Corinna Vinschen <corinna@vinschen.de>
* ldd.cc (STATUS_DLL_NOT_FOUND): Drop definition.
(report): Handle STATUS_ENTRYPOINT_NOT_FOUND exception. Explain why.
2015-07-08 Corinna Vinschen <corinna@vinschen.de>
* tzset.c (main): Check timezone and country case-insensitive.

View File

@ -42,10 +42,6 @@
#include <imagehlp.h>
#include <psapi.h>
#ifndef STATUS_DLL_NOT_FOUND
#define STATUS_DLL_NOT_FOUND (0xC0000135L)
#endif
struct option longopts[] =
{
{"help", no_argument, NULL, 'h'},
@ -346,6 +342,11 @@ report (const char *in_fn, bool multiple)
case EXCEPTION_DEBUG_EVENT:
switch (ev.u.Exception.ExceptionRecord.ExceptionCode)
{
case STATUS_ENTRYPOINT_NOT_FOUND:
/* A STATUS_ENTRYPOINT_NOT_FOUND might be encountered right after
loading all DLLs. We have to handle it here, otherwise ldd
runs into an endless loop. */
goto print_and_exit;
case STATUS_DLL_NOT_FOUND:
process_fn = fn_win;
break;
@ -359,6 +360,7 @@ report (const char *in_fn, bool multiple)
TerminateProcess (hProcess, 0);
break;
case EXIT_PROCESS_DEBUG_EVENT:
print_and_exit:
print_dlls (&dll_list, isdll ? fn_win : NULL, process_fn);
exitnow = true;
break;