diff mbox

[cygming] make sure libgcc logic is consistent

Message ID 201407221730.s6MHUA2j032116@greed.delorie.com
State New
Headers show

Commit Message

DJ Delorie July 22, 2014, 5:30 p.m. UTC
This patch changes the logic in "crtbegin" that looks for libgcc.dll
such that the test is only done once, guaranteeing consistent results
between the register and deregister cases.

Previously, a crash occurred if the application (directly or
indirectly) caused libgcc.dll to load after main() was called
(i.e. dlopen'd a DLL which required libgcc).  In that case, the
register test would return "no libgcc" and register with the local
copy, yet the deregister test would return "yes libgcc" and try to
deregister something with libgcc.dll that hadn't been registered.

Comments

Kai Tietz July 24, 2014, 3:51 p.m. UTC | #1
Hello DJ,

sorry for late reply.  Patch is ok. Please apply.

Thanks,
Kai

----- Original Message -----
> 
> This patch changes the logic in "crtbegin" that looks for libgcc.dll
> such that the test is only done once, guaranteeing consistent results
> between the register and deregister cases.
> 
> Previously, a crash occurred if the application (directly or
> indirectly) caused libgcc.dll to load after main() was called
> (i.e. dlopen'd a DLL which required libgcc).  In that case, the
> register test would return "no libgcc" and register with the local
> copy, yet the deregister test would return "yes libgcc" and try to
> deregister something with libgcc.dll that hadn't been registered.
> 
> Index: cygming-crtbegin.c
> ===================================================================
> --- cygming-crtbegin.c	(revision 212915)
> +++ cygming-crtbegin.c	(working copy)
> @@ -99,12 +99,13 @@ static EH_FRAME_SECTION_CONST char __EH_
>    = { };
>  
>  static struct object obj;
>  
>  /* Handle of libgcc's DLL reference.  */
>  HANDLE hmod_libgcc;
> +static void *  (*deregister_frame_fn) (const void *) == NULL;
>  #endif
>  
>  #if TARGET_USE_JCR_SECTION
>  static void *__JCR_LIST__[]
>    __attribute__ ((used, section(JCR_SECTION_NAME), aligned(4)))
>    = { };
> @@ -130,15 +131,20 @@ __gcc_register_frame (void)
>    if (h)
>      {
>        /* Increasing the load-count of LIBGCC_SONAME DLL.  */
>        hmod_libgcc = LoadLibrary (LIBGCC_SONAME);
>        register_frame_fn = (void (*) (const void *, struct object *))
>  			  GetProcAddress (h, "__register_frame_info");
> +      deregister_frame_fn = (void* (*) (const void *))
> +	                    GetProcAddress (h, "__deregister_frame_info");
> +    }
> +  else
> +    {
> +      register_frame_fn = __register_frame_info;
> +      deregister_frame_fn = __deregister_frame_info;
>      }
> -  else
> -    register_frame_fn = __register_frame_info;
>    if (register_frame_fn)
>       register_frame_fn (__EH_FRAME_BEGIN__, &obj);
>  #endif
>  
>  #if TARGET_USE_JCR_SECTION
>    if (__JCR_LIST__[0])
> @@ -158,19 +164,12 @@ __gcc_register_frame (void)
>  }
>  
>  void
>  __gcc_deregister_frame (void)
>  {
>  #if DWARF2_UNWIND_INFO
> -  void *  (*deregister_frame_fn) (const void *);
> -  HANDLE h = GetModuleHandle (LIBGCC_SONAME);
> -  if (h)
> -    deregister_frame_fn = (void* (*) (const void *))
> -			  GetProcAddress (h, "__deregister_frame_info");
> -  else
> -    deregister_frame_fn = __deregister_frame_info;
>    if (deregister_frame_fn)
>       deregister_frame_fn (__EH_FRAME_BEGIN__);
>    if (hmod_libgcc)
>      FreeLibrary (hmod_libgcc);
>  #endif
>  }
>
DJ Delorie July 24, 2014, 4:41 p.m. UTC | #2
> sorry for late reply.  Patch is ok. Please apply.

Applied.  Thanks!
diff mbox

Patch

Index: cygming-crtbegin.c
===================================================================
--- cygming-crtbegin.c	(revision 212915)
+++ cygming-crtbegin.c	(working copy)
@@ -99,12 +99,13 @@  static EH_FRAME_SECTION_CONST char __EH_
   = { };
 
 static struct object obj;
 
 /* Handle of libgcc's DLL reference.  */
 HANDLE hmod_libgcc;
+static void *  (*deregister_frame_fn) (const void *) == NULL;
 #endif
 
 #if TARGET_USE_JCR_SECTION
 static void *__JCR_LIST__[]
   __attribute__ ((used, section(JCR_SECTION_NAME), aligned(4)))
   = { };
@@ -130,15 +131,20 @@  __gcc_register_frame (void)
   if (h)
     {
       /* Increasing the load-count of LIBGCC_SONAME DLL.  */
       hmod_libgcc = LoadLibrary (LIBGCC_SONAME);
       register_frame_fn = (void (*) (const void *, struct object *))
 			  GetProcAddress (h, "__register_frame_info");
+      deregister_frame_fn = (void* (*) (const void *))
+	                    GetProcAddress (h, "__deregister_frame_info");
+    }
+  else
+    {
+      register_frame_fn = __register_frame_info;
+      deregister_frame_fn = __deregister_frame_info;
     }
-  else 
-    register_frame_fn = __register_frame_info;
   if (register_frame_fn)
      register_frame_fn (__EH_FRAME_BEGIN__, &obj);
 #endif
 
 #if TARGET_USE_JCR_SECTION 
   if (__JCR_LIST__[0])
@@ -158,19 +164,12 @@  __gcc_register_frame (void)
 }
 
 void
 __gcc_deregister_frame (void)
 {
 #if DWARF2_UNWIND_INFO
-  void *  (*deregister_frame_fn) (const void *);
-  HANDLE h = GetModuleHandle (LIBGCC_SONAME);
-  if (h)
-    deregister_frame_fn = (void* (*) (const void *))
-			  GetProcAddress (h, "__deregister_frame_info");
-  else 
-    deregister_frame_fn = __deregister_frame_info;
   if (deregister_frame_fn)
      deregister_frame_fn (__EH_FRAME_BEGIN__);
   if (hmod_libgcc)
     FreeLibrary (hmod_libgcc);
 #endif
 }