dev-lang/ruby: fix stack scavenge crash on ia64, bug #561780
authorSergei Trofimovich <slyfox@gentoo.org>
Fri, 26 May 2017 21:32:04 +0000 (22:32 +0100)
committerSergei Trofimovich <slyfox@gentoo.org>
Fri, 26 May 2017 21:33:07 +0000 (22:33 +0100)
Reported-by: Émeric Maschino
Bug: https://bugs.gentoo.org/561780
Package-Manager: Portage-2.3.6, Repoman-2.3.2

dev-lang/ruby/files/ruby-2.1.9-ia64.patch [new file with mode: 0644]
dev-lang/ruby/ruby-2.1.10.ebuild
dev-lang/ruby/ruby-2.1.9.ebuild
dev-lang/ruby/ruby-2.2.6.ebuild
dev-lang/ruby/ruby-2.2.7-r1.ebuild
dev-lang/ruby/ruby-2.2.7.ebuild
dev-lang/ruby/ruby-2.3.3-r1.ebuild
dev-lang/ruby/ruby-2.3.4-r1.ebuild
dev-lang/ruby/ruby-2.3.4.ebuild
dev-lang/ruby/ruby-2.4.1-r1.ebuild
dev-lang/ruby/ruby-2.4.1.ebuild

diff --git a/dev-lang/ruby/files/ruby-2.1.9-ia64.patch b/dev-lang/ruby/files/ruby-2.1.9-ia64.patch
new file mode 100644 (file)
index 0000000..028c5d0
--- /dev/null
@@ -0,0 +1,63 @@
+https://bugs.gentoo.org/561780
+https://github.com/ruby/ruby/pull/1625
+
+fix crash on register stack mark/sweep pass
+
+The crash looks like
+
+  Program received signal SIGSEGV, Segmentation fault.
+  mark_locations_array (objspace=0x6000000000045db0, x=0x0, n=864692227966763116) at gc.c:3297
+  3297            v = *x;
+  (gdb) bt
+  #0  mark_locations_array (objspace=0x6000000000045db0, x=0x0, n=864692227966763116) at gc.c:3297
+  #1  0x400000000014a040 in gc_mark_locations (objspace=0x6000000000045db0, start=0x0, end=0x6000080000000368) at gc.c:3310
+  #2  0x400000000014b3a0 in mark_current_machine_context (objspace=0x6000000000045db0, th=0x60000000000455b0) at gc.c:3500
+  #3  0x400000000014dfe0 in gc_mark_roots (objspace=0x6000000000045db0, full_mark=0, categoryp=0x0) at gc.c:4105
+  #4  0x400000000014e6b0 in gc_marks_body (objspace=0x6000000000045db0, full_mark=0) at gc.c:4164
+  #5  0x400000000014f260 in gc_marks (objspace=0x6000000000045db0, full_mark=0) at gc.c:4526
+  #6  0x40000000001525c0 in garbage_collect_body (objspace=0x6000000000045db0, full_mark=0, immediate_sweep=0, reason=256) at gc.c:5024
+  #7  0x400000000013c010 in heap_prepare_freepage (objspace=0x6000000000045db0, heap=0x6000000000045dc0) at gc.c:1219
+  #8  0x400000000013c140 in heap_get_freeobj_from_next_freepage (objspace=0x6000000000045db0, heap=0x6000000000045dc0) at gc.c:1237
+  #9  0x400000000013c360 in heap_get_freeobj (objspace=0x6000000000045db0, heap=0x6000000000045dc0) at gc.c:1259
+  #10 0x400000000013c950 in newobj_of (klass=0, flags=40, v1=0, v2=0, v3=0) at gc.c:1303
+  #11 0x400000000013ccc0 in rb_newobj_of (klass=0, flags=40) at gc.c:1356
+  #12 0x4000000000163740 in hash_alloc (klass=0) at hash.c:289
+  #13 0x4000000000163860 in rb_hash_new () at hash.c:309
+  #14 0x400000000050e420 in Init_BareVM () at vm.c:2822
+  #15 0x40000000000f6b60 in ruby_setup () at eval.c:54
+  #16 0x40000000000f6f50 in ruby_init () at eval.c:75
+  #17 0x400000000001b010 in main (argc=9, argv=0x60000fffffffb1d8) at main.c:35
+
+The problem here is in call
+    gc_mark_locations (objspace=0x6000000000045db0, start=0x0, end=0x6000080000000368) at gc.c:3310
+where 'start' (native_main_thread.register_stack_start)
+is supposed to be stack start but it's not initialized.
+
+The initialization of 'native_main_thread.register_stack_start'
+is supposed to be done in 'ruby_init_stack()'.
+
+But code under 'MAINSTACKADDR_AVAILABLE' exits early.
+The fix is to move 'register_stack_start' earlier.
+
+diff --git a/thread_pthread.c b/thread_pthread.c
+index c8a7a16..9ad448b 100644
+--- a/thread_pthread.c
++++ b/thread_pthread.c
+@@ -722,2 +722,8 @@ ruby_init_stack(volatile VALUE *addr
+     native_main_thread.id = pthread_self();
++#ifdef __ia64
++    if (!native_main_thread.register_stack_start ||
++        (VALUE*)bsp < native_main_thread.register_stack_start) {
++        native_main_thread.register_stack_start = (VALUE*)bsp;
++    }
++#endif
+ #if MAINSTACKADDR_AVAILABLE
+@@ -745,8 +751,2 @@ ruby_init_stack(volatile VALUE *addr
+ #endif
+-#ifdef __ia64
+-    if (!native_main_thread.register_stack_start ||
+-        (VALUE*)bsp < native_main_thread.register_stack_start) {
+-        native_main_thread.register_stack_start = (VALUE*)bsp;
+-    }
+-#endif
+     {
index b8599122f9db95706ff1b4503826dd55ddc34c09..f052d94d038a3b21917172bc45902e859d8ceffc 100644 (file)
@@ -65,6 +65,7 @@ PDEPEND="
 src_prepare() {
        EPATCH_FORCE="yes" EPATCH_SUFFIX="patch" \
                epatch "${WORKDIR}/patches"
+       epatch "${FILESDIR}"/${PN}-2.1.9-ia64.patch
 
        # We can no longer unbundle all of rake because rubygems now depends
        # on this. We leave the actual rake code around to bootstrap
index 0e1301fc8aa8aaf49b6083d9c5cc67c1b39b4d2a..9df13b9b0c25173dc80dd5cc39d8316840551f86 100644 (file)
@@ -61,6 +61,7 @@ PDEPEND="
 src_prepare() {
        EPATCH_FORCE="yes" EPATCH_SUFFIX="patch" \
                epatch "${WORKDIR}/patches"
+       epatch "${FILESDIR}"/${PN}-2.1.9-ia64.patch
 
        # We can no longer unbundle all of rake because rubygems now depends
        # on this. We leave the actual rake code around to bootstrap
index 874e266154acf6de49a8fa03b9959b49bd979903..40984e4c120d0cfea6b1647bb79da79b4cdab245 100644 (file)
@@ -74,6 +74,7 @@ PDEPEND="
 src_prepare() {
        EPATCH_FORCE="yes" EPATCH_SUFFIX="patch" \
                epatch "${WORKDIR}/patches"
+       epatch "${FILESDIR}"/${PN}-2.1.9-ia64.patch
 
        # We can no longer unbundle all of rake because rubygems now depends
        # on this. We leave the actual rake code around to bootstrap
index 621e417b2cf624aaaa6d656dd4d754f4a219f23e..7f24baec881bff9431af1b40a26f66a6a6cde606 100644 (file)
@@ -74,6 +74,7 @@ PDEPEND="
 src_prepare() {
        EPATCH_FORCE="yes" EPATCH_SUFFIX="patch" \
                epatch "${WORKDIR}/patches"
+       epatch "${FILESDIR}"/${PN}-2.1.9-ia64.patch
 
        # We can no longer unbundle all of rake because rubygems now depends
        # on this. We leave the actual rake code around to bootstrap
index 815d51d85510af6f77b7af1c66702e282b9967ab..5b4776d845a801fb19cdff0d0a325bf29bb3be44 100644 (file)
@@ -74,6 +74,7 @@ PDEPEND="
 src_prepare() {
        EPATCH_FORCE="yes" EPATCH_SUFFIX="patch" \
                epatch "${WORKDIR}/patches"
+       epatch "${FILESDIR}"/${PN}-2.1.9-ia64.patch
 
        # We can no longer unbundle all of rake because rubygems now depends
        # on this. We leave the actual rake code around to bootstrap
index cb9bbb4e5905d27a5bf0baadbd1465b946c8b70a..2145136d85e46c8013fdf12d2905d4ffc7e0259c 100644 (file)
@@ -76,6 +76,7 @@ PDEPEND="
 src_prepare() {
        EPATCH_FORCE="yes" EPATCH_SUFFIX="patch" \
                epatch "${WORKDIR}/patches"
+       epatch "${FILESDIR}"/${PN}-2.1.9-ia64.patch
 
        einfo "Unbundling gems..."
        cd "$S"
index c3c8f0b927727243ca88bfee995a9ad918df6f67..3f438d2601e3251aeb3b5bd3f050787162b5a255 100644 (file)
@@ -76,6 +76,7 @@ PDEPEND="
 src_prepare() {
        EPATCH_FORCE="yes" EPATCH_SUFFIX="patch" \
                epatch "${WORKDIR}/patches"
+       epatch "${FILESDIR}"/${PN}-2.1.9-ia64.patch
 
        einfo "Unbundling gems..."
        cd "$S"
index cb9bbb4e5905d27a5bf0baadbd1465b946c8b70a..2145136d85e46c8013fdf12d2905d4ffc7e0259c 100644 (file)
@@ -76,6 +76,7 @@ PDEPEND="
 src_prepare() {
        EPATCH_FORCE="yes" EPATCH_SUFFIX="patch" \
                epatch "${WORKDIR}/patches"
+       epatch "${FILESDIR}"/${PN}-2.1.9-ia64.patch
 
        einfo "Unbundling gems..."
        cd "$S"
index 18a9fd3fe32b4a69d20f546aa6696fb33935073e..e316adee159a855312f9c6f0e53a1e0a79bfb4a2 100644 (file)
@@ -75,6 +75,7 @@ PDEPEND="
 src_prepare() {
        EPATCH_FORCE="yes" EPATCH_SUFFIX="patch" \
                epatch "${WORKDIR}/patches"
+       eapply "${FILESDIR}"/${PN}-2.1.9-ia64.patch
 
        einfo "Unbundling gems..."
        cd "$S"
index 1f1300c8139d07b06df26c3302eaa605dbd25648..18cdd65b8f90414897985cbb330975efe61aaddb 100644 (file)
@@ -75,6 +75,7 @@ PDEPEND="
 src_prepare() {
        EPATCH_FORCE="yes" EPATCH_SUFFIX="patch" \
                epatch "${WORKDIR}/patches"
+       eapply "${FILESDIR}"/${PN}-2.1.9-ia64.patch
 
        einfo "Unbundling gems..."
        cd "$S"