On Nov 18 23:09, Takashi Yano wrote:
> If dlopen() for DLL A is called in constructor DLL B, the constructor
> for DLL A is called twice, once called via cygwin_attach_dll() called
> from LoadLibrary(), and again from dll_list::init(). That is, the DLL
> with DLL_LOAD does not need dll::init() in dll_list::init(). This issue
> was found when debugging the issue:
> https://cygwin.com/pipermail/cygwin/2025-October/258877.html
> This patch remove dll::init() call in dll_list::init() for DLL_LOAD.
> 
> Fixes: 2eb392bd77de ("dll_init.cc: Revamp.  Use new classes.")
> Reviewed-by: Mark Geisert <[email protected]>, Jon Turney 
> <[email protected]>
> Signed-off-by: Takashi Yano <[email protected]>
> ---
>  winsup/cygwin/dll_init.cc | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/winsup/cygwin/dll_init.cc b/winsup/cygwin/dll_init.cc
> index 5ef0fa875..e26457a69 100644
> --- a/winsup/cygwin/dll_init.cc
> +++ b/winsup/cygwin/dll_init.cc
> @@ -612,9 +612,10 @@ dll_list::init ()
>    /* Walk the dll chain, initializing each dll */
>    dll *d = &start;
>    dll_global_dtors_recorded = d->next != NULL;
> -  /* Init linked and early loaded Cygwin DLLs. */
> +  /* Init linked Cygwin DLLs. As for loaded DLLs, dll::init() is already
> +     called via _cygwin_dll_entry called from LoadLibrary(). */
>    while ((d = d->next))
> -    if (d->type == DLL_LINK || d->type == DLL_LOAD)
> +    if (d->type == DLL_LINK)
>        d->init ();
>  }
>  
> -- 
> 2.51.0

LGTM.


Thanks,
Corinna

Reply via email to