From 9a69395cccb02d9864ceb13609a02e3f7b0f2ad7 Mon Sep 17 00:00:00 2001 From: Isaku Yamahata Date: Wed, 24 Jul 2019 13:08:47 -0700 Subject: [PATCH] [LibOS] disable preempt on helper thread exit When a helper thread exit voluntariy, the following segv happends. The reason for segv is, __handle_signal() tries to access shim_thread, it's already freed. This situation only happens with helper threads. exit system call doesn't trigger this pattern. So add __disable_preempt() before put_thread() in helper function as exeption. > #0 0x00007f99f900d77e in atomic_read (v=0x7f99f8d772b8) at ../../../Pal/lib/atomic.h:93 > #1 0x00007f99f900f800 in __handle_signal (tcb=0x7f99f9522ec0, sig=1) at bookkeep/shim_signal.c:677 > #2 0x00007f99f90052dd in enable_preempt (tcb=0x7f99f9522ec0) at ../include/shim_internal.h:507 > #3 0x00007f99f90053db in unlock (l=0x7f99f930c190 ) at ../include/shim_internal.h:581 > #4 0x00007f99f9007c65 in bkeep_munmap (addr=0x7f99f8d77000, length=8192, flags=536870912) at bookkeep/shim_vma.c:681 > #5 0x00007f99f90731f0 in __system_free (addr=0x7f99f8d77000, size=5176) at shim_malloc.c:102 > #6 0x00007f99f9072ead in slab_free (mgr=0x7f99f8dc6000, obj=0x7f99f8d77020) at ../../../Pal/lib/slabmgr.h:465 > #7 0x00007f99f90733e7 in free (mem=0x7f99f8d77020) at shim_malloc.c:332 > #8 0x00007f99f900ae99 in put_thread (thread=0x7f99f8d77020) at bookkeep/shim_thread.c:346 > #9 0x00007f99f90742c7 in shim_async_helper (arg=0x7f99f8d77020) at shim_async.c:271 > #10 0x00007f99f931cd76 in pal_thread_init (tcbptr=) at db_threading.c:75 > #11 0x00007f99f9321776 in clone () at clone-x86_64.S:105 Signed-off-by: Isaku Yamahata --- LibOS/shim/src/ipc/shim_ipc_helper.c | 1 + LibOS/shim/src/shim_async.c | 1 + 2 files changed, 2 insertions(+) diff --git a/LibOS/shim/src/ipc/shim_ipc_helper.c b/LibOS/shim/src/ipc/shim_ipc_helper.c index 3cad5a089e..e0021e74ef 100644 --- a/LibOS/shim/src/ipc/shim_ipc_helper.c +++ b/LibOS/shim/src/ipc/shim_ipc_helper.c @@ -780,6 +780,7 @@ noreturn static void shim_ipc_helper(void* dummy) { free(object_list); free(palhandle_list); + __disable_preempt(&self->tcb->shim_tcb); put_thread(self); debug("IPC helper thread terminated\n"); diff --git a/LibOS/shim/src/shim_async.c b/LibOS/shim/src/shim_async.c index 2e79d7af6f..12f4f532ba 100644 --- a/LibOS/shim/src/shim_async.c +++ b/LibOS/shim/src/shim_async.c @@ -268,6 +268,7 @@ static void shim_async_helper(void * arg) { polled = DkObjectsWaitAny(object_num + 1, object_list, sleep_time); } + __disable_preempt(&self->tcb->shim_tcb); put_thread(self); debug("Async helper thread terminated\n"); free(object_list);