summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBen Noordhuis <info@bnoordhuis.nl>2019-05-24 16:56:19 +0200
committerRich Trott <rtrott@gmail.com>2019-06-02 11:09:02 +0200
commit5539d7e360a625e729a4f95e67d232d3400fc137 (patch)
tree13ae70491eb15d857843de50ac60e5121f5d6a8f /src
parentc6f545a74a0d6888d2e628019a98a882a9325855 (diff)
downloadandroid-node-v8-5539d7e360a625e729a4f95e67d232d3400fc137.tar.gz
android-node-v8-5539d7e360a625e729a4f95e67d232d3400fc137.tar.bz2
android-node-v8-5539d7e360a625e729a4f95e67d232d3400fc137.zip
inspector: more conservative minimum stack size
PTHREAD_STACK_MIN is 2 KB with musl, which is too small to safely receive signals. PTHREAD_STACK_MIN + MINSIGSTKSZ is 8 KB on arm64, which is the musl architecture with the biggest MINSIGSTKSZ so let's use that as a lower bound and let's quadruple it just in case. PR-URL: https://github.com/nodejs/node/pull/27855 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Eugene Ostroukhov <eostroukhov@google.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Rich Trott <rtrott@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/inspector_agent.cc19
1 files changed, 13 insertions, 6 deletions
diff --git a/src/inspector_agent.cc b/src/inspector_agent.cc
index 83f7140e93..12e62d3e2b 100644
--- a/src/inspector_agent.cc
+++ b/src/inspector_agent.cc
@@ -25,6 +25,7 @@
#include <climits> // PTHREAD_STACK_MIN
#endif // __POSIX__
+#include <algorithm>
#include <cstring>
#include <sstream>
#include <unordered_map>
@@ -111,12 +112,18 @@ static int StartDebugSignalHandler() {
CHECK_EQ(0, uv_sem_init(&start_io_thread_semaphore, 0));
pthread_attr_t attr;
CHECK_EQ(0, pthread_attr_init(&attr));
- // Don't shrink the thread's stack on FreeBSD. Said platform decided to
- // follow the pthreads specification to the letter rather than in spirit:
- // https://lists.freebsd.org/pipermail/freebsd-current/2014-March/048885.html
-#ifndef __FreeBSD__
- CHECK_EQ(0, pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN));
-#endif // __FreeBSD__
+#if defined(PTHREAD_STACK_MIN) && !defined(__FreeBSD__)
+ // PTHREAD_STACK_MIN is 2 KB with musl libc, which is too small to safely
+ // receive signals. PTHREAD_STACK_MIN + MINSIGSTKSZ is 8 KB on arm64, which
+ // is the musl architecture with the biggest MINSIGSTKSZ so let's use that
+ // as a lower bound and let's quadruple it just in case. The goal is to avoid
+ // creating a big 2 or 4 MB address space gap (problematic on 32 bits
+ // because of fragmentation), not squeeze out every last byte.
+ // Omitted on FreeBSD because it doesn't seem to like small stacks.
+ const size_t stack_size = std::max(static_cast<size_t>(4 * 8192),
+ static_cast<size_t>(PTHREAD_STACK_MIN));
+ CHECK_EQ(0, pthread_attr_setstacksize(&attr, stack_size));
+#endif // defined(PTHREAD_STACK_MIN) && !defined(__FreeBSD__)
CHECK_EQ(0, pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED));
sigset_t sigmask;
// Mask all signals.