summaryrefslogtreecommitdiff
path: root/src/thread.c
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2016-12-23 10:24:30 +0200
committerEli Zaretskii <eliz@gnu.org>2016-12-23 10:24:30 +0200
commitc4e38581d3b4d6b19921f0db81f319d19ae4fb9e (patch)
tree24d0879a5ad238d97ba25a374db47860ac05ddd0 /src/thread.c
parenta978d300a3faf58ee6e94ba57f764ca99a9ec308 (diff)
downloademacs-c4e38581d3b4d6b19921f0db81f319d19ae4fb9e.tar.gz
Avoid aborts due to unaligned byte stack of threads
* src/thread.c (run_thread): Make sure the pointers to thread byte stack are properly aligned. (Bug#25247)
Diffstat (limited to 'src/thread.c')
-rw-r--r--src/thread.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/thread.c b/src/thread.c
index 9613d1435f7..3f9595274e9 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -643,12 +643,19 @@ do_nothing (Lisp_Object whatever)
static void *
run_thread (void *state)
{
- char stack_pos;
+ /* Make sure stack_top and m_stack_bottom are properly aligned as GC
+ expects. */
+ union
+ {
+ void *p;
+ char c;
+ } stack_pos;
+
struct thread_state *self = state;
struct thread_state **iter;
- self->m_stack_bottom = &stack_pos;
- self->stack_top = &stack_pos;
+ self->m_stack_bottom = &stack_pos.c;
+ self->stack_top = &stack_pos.c;
self->thread_id = sys_thread_self ();
acquire_global_lock (self);