diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2018-03-16 11:34:27 +0000 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2018-03-16 11:36:49 +0000 |
commit | 818d6e0c2336b8c682c96e933acbf8a1d6e7a343 (patch) | |
tree | 429a37d6af4608a760b26134e7bafb08a430df88 /main/ruby/fix-get_main_stack.patch | |
parent | 48aaa1d6b757959dd3d1ea49460df3ce197434ba (diff) | |
download | aports-818d6e0c2336b8c682c96e933acbf8a1d6e7a343.tar.bz2 aports-818d6e0c2336b8c682c96e933acbf8a1d6e7a343.tar.xz |
main/ruby: fix calculation of stack size for main thread
Upstream bug reports:
https://bugs.ruby-lang.org/issues/14387
https://github.com/docker-library/ruby/issues/196
Diffstat (limited to 'main/ruby/fix-get_main_stack.patch')
-rw-r--r-- | main/ruby/fix-get_main_stack.patch | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/main/ruby/fix-get_main_stack.patch b/main/ruby/fix-get_main_stack.patch new file mode 100644 index 0000000000..4bb9a09324 --- /dev/null +++ b/main/ruby/fix-get_main_stack.patch @@ -0,0 +1,70 @@ +diff --git a/thread_pthread.c b/thread_pthread.c +index 951885ffa0..cf90321d1d 100644 +--- a/thread_pthread.c ++++ b/thread_pthread.c +@@ -530,9 +530,6 @@ hpux_attr_getstackaddr(const pthread_attr_t *attr, void **addr) + # define MAINSTACKADDR_AVAILABLE 0 + # endif + #endif +-#if MAINSTACKADDR_AVAILABLE && !defined(get_main_stack) +-# define get_main_stack(addr, size) get_stack(addr, size) +-#endif + + #ifdef STACKADDR_AVAILABLE + /* +@@ -614,6 +611,55 @@ get_stack(void **addr, size_t *size) + return 0; + #undef CHECK_ERR + } ++ ++#if defined(__linux__) && !defined(__GLIBC__) && defined(HAVE_GETRLIMIT) ++ ++#ifndef PAGE_SIZE ++#include <unistd.h> ++#define PAGE_SIZE sysconf(_SC_PAGE_SIZE) ++#endif ++ ++static int ++get_main_stack(void **addr, size_t *size) ++{ ++ size_t start, end, limit, prevend = 0; ++ struct rlimit r; ++ FILE *f; ++ char buf[PATH_MAX+80], s[8]; ++ int n; ++ STACK_GROW_DIR_DETECTION; ++ ++ f = fopen("/proc/self/maps", "re"); ++ if (!f) ++ return -1; ++ n = 0; ++ while (fgets(buf, sizeof buf, f)) { ++ n = sscanf(buf, "%zx-%zx %*s %*s %*s %*s %7s", &start, &end, s); ++ if (n >= 2) { ++ if (n == 3 && strcmp(s, "[stack]") == 0) ++ break; ++ prevend = end; ++ } ++ n = 0; ++ } ++ fclose(f); ++ if (n == 0) ++ return -1; ++ ++ limit = 100 << 20; /* 100MB stack limit */ ++ if (getrlimit(RLIMIT_STACK, &r)==0 && r.rlim_cur < limit) ++ limit = r.rlim_cur & -PAGE_SIZE; ++ if (limit > end) limit = end; ++ if (prevend < end - limit) prevend = end - limit; ++ if (start > prevend) start = prevend; ++ *addr = IS_STACK_DIR_UPPER() ? (void *)start : (void *)end; ++ *size = end - start; ++ return 0; ++} ++#else ++# define get_main_stack(addr, size) get_stack(addr, size) ++#endif ++ + #endif + + static struct { |