]> sourceware.org Git - newlib-cygwin.git/commitdiff
Fix potential hang in ldd if DLL encounters missing entry point
authorCorinna Vinschen <corinna@vinschen.de>
Mon, 20 Jul 2015 16:32:24 +0000 (18:32 +0200)
committerCorinna Vinschen <corinna@vinschen.de>
Mon, 20 Jul 2015 16:32:24 +0000 (18:32 +0200)
         * 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>
winsup/utils/ChangeLog
winsup/utils/ldd.cc

index db6049bb1473342b0b3bb7ec54d41e7dcd923f46..bc8835fd0ec6bdef6687e112596ec7bed722a7d4 100644 (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.
index de98658bcaa9f7f11b22b68cc96ab87f374dd044..e4c14b489ea8fece3ccaba03db7194016cc63b0d 100644 (file)
 #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;
This page took 0.035336 seconds and 5 git commands to generate.