64 lines
2.4 KiB
Diff
64 lines
2.4 KiB
Diff
From f92888853439a8ded221f3423865c78de2a96a14 Mon Sep 17 00:00:00 2001
|
|
From: Sergei Trofimovich <slyfox@gentoo.org>
|
|
Date: Sun, 5 Nov 2017 09:30:45 +0000
|
|
Subject: ia64: Fix crash in thread context switch.
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Fixes <https://bugs.gnu.org/29151> and <https://bugs.gentoo.org/613986>.
|
|
|
|
Backtrace looks like that:
|
|
|
|
Program terminated with signal SIGSEGV, Segmentation fault.
|
|
#0 0x200000000014a5c0 in scm_ia64_longjmp (JB=0x6000000000817020, VAL=1) at continuations.c:372
|
|
372 t->pending_rbs_continuation->backing_store,
|
|
[Current thread is 1 (Thread 0x2000000000049340 (LWP 8190))]
|
|
(gdb) bt
|
|
#0 0x200000000014a5c0 in scm_ia64_longjmp (JB=0x6000000000817020, VAL=1) at continuations.c:372
|
|
#1 0x2000000000148e00 in scm_c_abort (vm=0x60000000000edea0, tag=0x6000000000795ba0, n=0, argv=0x60000fffff7f0ce0, cookie=-1) at control.c:239
|
|
#2 0x2000000000149070 in scm_at_abort (tag=0x6000000000795ba0, args=0x304) at control.c:258
|
|
(gdb) print t
|
|
$2 = (scm_i_thread *) 0x6000000000068000
|
|
(gdb) print t->pending_rbs_continuation
|
|
$3 = (scm_t_contregs *) 0xffeb
|
|
|
|
The problem here is the value of 't->pending_rbs_continuation' pointer.
|
|
It's supposed to poin to a register stack pointer or be NULL if not yet
|
|
backed up.
|
|
|
|
The problem is it is never initialized to NULL at creation time and
|
|
contained garbage on stack. Sometimes people are lucky and have zeros
|
|
on stack and guile works. But sometimes there is something and guile
|
|
crashes.
|
|
|
|
The fix is trivial: initialize 'pending_rbs_continuation = NULL'
|
|
at thread registration time (the same way other threads are registered).
|
|
|
|
Reported-by: Matt Turner
|
|
|
|
* libguile/threads.c (guilify_self_1): Initialize pending_rbs_continuation
|
|
to avoid crash on ia64.
|
|
|
|
Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
|
|
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
|
|
---
|
|
libguile/threads.c | 1 +
|
|
1 file changed, 1 insertion(+)
|
|
|
|
diff --git a/libguile/threads.c b/libguile/threads.c
|
|
index 9ceb5b8..770f62c 100644
|
|
--- a/libguile/threads.c
|
|
+++ b/libguile/threads.c
|
|
@@ -395,6 +395,7 @@ guilify_self_1 (struct GC_stack_base *base, int needs_unregister)
|
|
t.base = base->mem_base;
|
|
#ifdef __ia64__
|
|
t.register_backing_store_base = base->reg_base;
|
|
+ t.pending_rbs_continuation = 0;
|
|
#endif
|
|
t.continuation_root = SCM_EOL;
|
|
t.continuation_base = t.base;
|
|
--
|
|
cgit v1.0-41-gc330
|
|
|