aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2018-03-16 11:34:27 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2018-03-16 11:36:49 +0000
commit818d6e0c2336b8c682c96e933acbf8a1d6e7a343 (patch)
tree429a37d6af4608a760b26134e7bafb08a430df88
parent48aaa1d6b757959dd3d1ea49460df3ce197434ba (diff)
downloadaports-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
-rw-r--r--main/ruby/APKBUILD9
-rw-r--r--main/ruby/fix-get_main_stack.patch70
2 files changed, 76 insertions, 3 deletions
diff --git a/main/ruby/APKBUILD b/main/ruby/APKBUILD
index fb5a72e4f7..446cb411b5 100644
--- a/main/ruby/APKBUILD
+++ b/main/ruby/APKBUILD
@@ -18,7 +18,7 @@
pkgname=ruby
pkgver=2.5.0
_abiver="${pkgver%.*}.0"
-pkgrel=0
+pkgrel=1
pkgdesc="An object-oriented language for quick and easy programming"
url="http://www.ruby-lang.org/en/"
arch="all"
@@ -52,7 +52,9 @@ subpackages="$pkgname-doc $pkgname-dev
"
source="ftp://ftp.ruby-lang.org/pub/ruby/${pkgver%.*}/$pkgname-$pkgver.tar.bz2
rubygems-avoid-platform-specific-gems.patch
- test_insns-lower-recursion-depth.patch"
+ test_insns-lower-recursion-depth.patch
+ fix-get_main_stack.patch
+ "
replaces="ruby-gems"
builddir="$srcdir/$pkgname-$pkgver"
@@ -324,4 +326,5 @@ _mvgem() {
sha512sums="8f6fdf6708e7470f55bc009db2567cd8d4e633ad0678d83a015441ecf5b5d88bd7da8fb8533a42157ff83b74d00b6dc617d39bbb17fc2c6c12287a1d8eaa0f2c ruby-2.5.0.tar.bz2
cfdc5ea3b2e2ea69c51f38e8e2180cb1dc27008ca55cc6301f142ebafdbab31c3379b3b6bba9ff543153876dd98ed2ad194df3255b7ea77a62e931c935f80538 rubygems-avoid-platform-specific-gems.patch
-814fe6359505b70d8ff680adf22f20a74b4dbd3fecc9a63a6c2456ee9824257815929917b6df5394ed069a6869511b8c6dce5b95b4acbbb7867c1f3a975a0150 test_insns-lower-recursion-depth.patch"
+814fe6359505b70d8ff680adf22f20a74b4dbd3fecc9a63a6c2456ee9824257815929917b6df5394ed069a6869511b8c6dce5b95b4acbbb7867c1f3a975a0150 test_insns-lower-recursion-depth.patch
+8d730f02f76e53799f1c220eb23e3d2305940bb31216a7ab1e42d3256149c0721c7d173cdbfe505023b1af2f5cb3faa233dcc1b5d560fa8f980c17c2d29a9d81 fix-get_main_stack.patch"
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 {