Modified darwin_stop_world.c to use an arm_unified_thread_state_t struct to
authorNiklas Therning <niklas@therning.org>
Wed, 17 Sep 2014 16:09:55 +0000 (18:09 +0200)
committerNiklas Therning <niklas@therning.org>
Wed, 17 Sep 2014 16:30:38 +0000 (18:30 +0200)
commit73ee11a2a920fafa67f9bd3586f1dbc8f539a6fc
tree434e449cc1767e6ccf66e560245413d25537d2e9
parent3d342554dc03af8d27925706a6513080995e1904
Modified darwin_stop_world.c to use an arm_unified_thread_state_t struct to
store a thread's state when compiling against the iOS 7/8 SDK. Without this
patch GC_stack_range_for() crashes when running a 32-bit app on iOS 64-bit.
The old code passed an arm_thread_state_t and ARM_THREAD_STATE to
thread_get_state(). ARM_THREAD_STATE is the same as ARM_UNIFIED_THREAD_STATE
on iOS 7/8 and thread_get_state() actually expects an
arm_unified_thread_state_t. On iOS 32-bit it looks like thread_get_state()
only touches the first bytes corresponding to the size of arm_thread_state_t
so no crash there. On iOS 64-bit however it seems thread_get_state() writes to
the full arm_unified_thread_state_t which meant it would overflow the stack
allocated struct passed to it and mess up other values on the stack leading to
a crash later on.
darwin_stop_world.c
include/private/gc_priv.h