[newlib-cygwin/main] Cygwin: dlsym: fetch module list via EnumProcessModules
Corinna Vinschen
corinna@sourceware.org
Thu Jul 3 11:00:01 GMT 2025
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=cb33699b031f5b716b4b9522b88275ebf41210d0
commit cb33699b031f5b716b4b9522b88275ebf41210d0
Author: Corinna Vinschen <corinna@vinschen.de>
AuthorDate: Wed Jul 2 22:18:50 2025 +0200
Commit: Corinna Vinschen <corinna@vinschen.de>
CommitDate: Thu Jul 3 12:36:15 2025 +0200
Cygwin: dlsym: fetch module list via EnumProcessModules
We're using RtlQueryProcessDebugInformation from dlsym since
commit 31ddf45dd8694 ("* autoload.cc (EnumProcessModules): Remove.")
Observations on the Cygwin mailing list show that calling
RtlQueryProcessDebugInformation on a process is neither
thread-safe, nor multi-process-safe, see
https://cygwin.com/pipermail/cygwin/2025-July/258403.html
for details.
This patch essentially reverts 31ddf45dd8694. Fetch the list of
loaded modules in the current process by calling EnumProcessModules
again.
Reported-by: Christian Franke <Christian.Franke@t-online.de>
Fixes: 31ddf45dd8694 ("* autoload.cc (EnumProcessModules): Remove.")
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diff:
---
winsup/cygwin/autoload.cc | 2 ++
winsup/cygwin/dlfcn.cc | 35 +++++++++++------------------------
2 files changed, 13 insertions(+), 24 deletions(-)
diff --git a/winsup/cygwin/autoload.cc b/winsup/cygwin/autoload.cc
index 35b207e9daf3..d5d344d21dd4 100644
--- a/winsup/cygwin/autoload.cc
+++ b/winsup/cygwin/autoload.cc
@@ -525,6 +525,8 @@ LoadDLLfunc (CoInitialize, ole32)
LoadDLLfunc (CoUninitialize, ole32)
LoadDLLfunc (CoTaskMemFree, ole32)
+LoadDLLfunc (EnumProcessModules, psapi)
+
LoadDLLfunc (LsaConnectUntrusted, secur32)
LoadDLLfunc (LsaDeregisterLogonProcess, secur32)
LoadDLLfunc (LsaFreeReturnBuffer, secur32)
diff --git a/winsup/cygwin/dlfcn.cc b/winsup/cygwin/dlfcn.cc
index 9b6bb55b34a3..e06616d7fa77 100644
--- a/winsup/cygwin/dlfcn.cc
+++ b/winsup/cygwin/dlfcn.cc
@@ -7,6 +7,7 @@ Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
#include "winsup.h"
+#include <psapi.h>
#include <stdlib.h>
#include <dlfcn.h>
#include <ctype.h>
@@ -318,32 +319,18 @@ dlsym (void *handle, const char *name)
if (handle == RTLD_DEFAULT)
{ /* search all modules */
- PDEBUG_BUFFER buf;
- NTSTATUS status;
+ HMODULE *modules;
+ tmp_pathbuf tp;
+ DWORD size;
- buf = RtlCreateQueryDebugBuffer (0, FALSE);
- if (!buf)
- {
- set_errno (ENOMEM);
- set_dl_error ("dlsym");
- return NULL;
- }
- status = RtlQueryProcessDebugInformation (GetCurrentProcessId (),
- PDI_MODULES, buf);
- if (!NT_SUCCESS (status))
- __seterrno_from_nt_status (status);
+ modules = (HMODULE *) tp.w_get ();
+ if (!EnumProcessModules (GetCurrentProcess (), modules,
+ 2 * NT_MAX_PATH, &size))
+ __seterrno ();
else
- {
- PDEBUG_MODULE_ARRAY mods = (PDEBUG_MODULE_ARRAY)
- buf->ModuleInformation;
- for (ULONG i = 0; i < mods->Count; ++i)
- if ((ret = (void *)
- GetProcAddress ((HMODULE) mods->Modules[i].Base, name)))
- break;
- if (!ret)
- set_errno (ENOENT);
- }
- RtlDestroyQueryDebugBuffer (buf);
+ for (uint32_t i = 0; i < size / sizeof (HMODULE); ++i)
+ if ((ret = (void *) GetProcAddress (modules[i], name)))
+ break;
}
else
{
More information about the Cygwin-cvs
mailing list