From a7aa18fff3cc437f84768b1d6d4a2b65dab9585f Mon Sep 17 00:00:00 2001
From: NIIBE Yutaka <gniibe@fsij.org>
Date: Wed, 29 Oct 2025 15:44:46 +0900
Subject: [PATCH 5/6] secmem: Handle HAVE_BROKEN_MLOCK for the case with ASAN.

* src/secmem.c [HAVE_BROKEN_MLOCK] (lock_pool_pages): Take care when
build with address sanitizer.

--

Cherry pick the master commit of:
	fe06287003a153d358f2ddb62ce5d1ec112b2e5c

GnuPG-bug-id: 7889
Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
---
 src/secmem.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/secmem.c b/src/secmem.c
index 4e1d2991..19cf1ad4 100644
--- a/src/secmem.c
+++ b/src/secmem.c
@@ -292,27 +292,36 @@ lock_pool_pages (void *p, size_t n)
 #if defined(HAVE_MLOCK)
   uid_t uid;
   int err;
 
   uid = getuid ();
 
 #ifdef HAVE_BROKEN_MLOCK
+#if defined(__has_feature) && __has_feature(address_sanitizer)
+  /* Address sanitizer and mlock is incompatible.  We can't use mlock
+   * with address sanitizer enabled.  Proceed with NO_MLOCK=1.  */
+  (void)p;
+  (void)n;
+  no_mlock = 1;
+  err = 0;
+#else
   /* Under HP/UX mlock segfaults if called by non-root.  Note, we have
      noch checked whether mlock does really work under AIX where we
-     also detected a broken nlock.  Note further, that using plock ()
+     also detected a broken mlock.  Note further, that using plock ()
      is not a good idea under AIX. */
   if (uid)
     {
       errno = EPERM;
       err = -1;
     }
   else
     {
       err = no_mlock? 0 : mlock (p, n);
     }
+#endif
 #else /* !HAVE_BROKEN_MLOCK */
   err = no_mlock? 0 : mlock (p, n);
 #endif /* !HAVE_BROKEN_MLOCK */
 
   /* Test whether we are running setuid(0).  */
   if (uid && ! geteuid ())
     {
-- 
2.51.0

