Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2015-07-20 19:32:24 +0300
committerCorinna Vinschen <corinna@vinschen.de>2015-07-20 19:32:24 +0300
commit23ad79d7de0a3ff47ad211347340b7c6750caedc (patch)
tree719ca2e318a853480970568666ec24c235225d21 /winsup/utils/ldd.cc
parente437a7d826188da96ca9b06ecb03987196974f3f (diff)
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>
Diffstat (limited to 'winsup/utils/ldd.cc')
-rw-r--r--winsup/utils/ldd.cc10
1 files changed, 6 insertions, 4 deletions
diff --git a/winsup/utils/ldd.cc b/winsup/utils/ldd.cc
index de98658bc..e4c14b489 100644
--- a/winsup/utils/ldd.cc
+++ b/winsup/utils/ldd.cc
@@ -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;