|
|
Message-ID: <20250321170417.2959-1-Kenji.Mouri@outlook.com>
Date: Sat, 22 Mar 2025 01:04:16 +0800
From: MouriNaruto <mourinaruto@...il.com>
To: musl@...ts.openwall.com
Cc: MouriNaruto <Kenji.Mouri@...look.com>
Subject: [PATCH] workaround the issue that pthread_getattr_np won't return in FreeBSD Linuxulator
Some notes from Kenji Mouri (MouriNaruto) about this workaround:
I tried to use musl-based userspace in FreeBSD's Linuxulator, I found some
Node.js based app will hung at startup. I did some investigations and finally
found that caused by the mremap loop in the musl's pthread_getattr_np. I read
the FreeBSD's Linuxulator source code, it seems mremap in FreeBSD's Linuxulator
in won't support expand the size.
With Edward Tomasz Napierala (https://wiki.freebsd.org/EdwardTomaszNapierala)'s
suggestion, choose to use RLIMIT_STACK _in addition_ to the current measurement
can workaround the issue without doing much modifications.
Consider that getrlimit may failed, so I think we should use __default_stacksize
when getrlimit failed.
I have tested this commit in my FreeBSD environment with Visual Studio Code
Remote SSH server which requires the FreeBSD's Linuxulator.
---
src/thread/pthread_getattr_np.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/src/thread/pthread_getattr_np.c b/src/thread/pthread_getattr_np.c
index 2881831f..54b1ba34 100644
--- a/src/thread/pthread_getattr_np.c
+++ b/src/thread/pthread_getattr_np.c
@@ -2,6 +2,7 @@
#include "pthread_impl.h"
#include "libc.h"
#include <sys/mman.h>
+#include <sys/resource.h>
int pthread_getattr_np(pthread_t t, pthread_attr_t *a)
{
@@ -12,11 +13,19 @@ int pthread_getattr_np(pthread_t t, pthread_attr_t *a)
a->_a_stackaddr = (uintptr_t)t->stack;
a->_a_stacksize = t->stack_size;
} else {
+ struct rlimit rl_stack = {0};
+ /* get the current stack limit to workaround the issue */
+ /* that mremap loop won't stop in FreeBSD Linuxulator */
+ if (getrlimit(RLIMIT_STACK, &rl_stack) != 0) {
+ /* use default stack size if getrlimit fails */
+ rl_stack.rlim_cur = __default_stacksize;
+ rl_stack.rlim_max = __default_stacksize;
+ }
char *p = (void *)libc.auxv;
size_t l = PAGE_SIZE;
p += -(uintptr_t)p & PAGE_SIZE-1;
a->_a_stackaddr = (uintptr_t)p;
- while (mremap(p-l-PAGE_SIZE, PAGE_SIZE, 2*PAGE_SIZE, 0)==MAP_FAILED && errno==ENOMEM)
+ while (l <= rl_stack.rlim_cur && mremap(p-l-PAGE_SIZE, PAGE_SIZE, 2*PAGE_SIZE, 0)==MAP_FAILED && errno==ENOMEM)
l += PAGE_SIZE;
a->_a_stacksize = l;
}
--
2.47.2
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.