Skip to content
This repository has been archived by the owner on Jan 20, 2022. It is now read-only.

Commit

Permalink
[LibOS] disable preempt on helper thread exit
Browse files Browse the repository at this point in the history
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 <vma_list_lock>) 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=<optimized out>) at db_threading.c:75
> #11 0x00007f99f9321776 in clone () at clone-x86_64.S:105

Signed-off-by: Isaku Yamahata <isaku.yamahata@gmail.com>
  • Loading branch information
yamahata committed Jul 24, 2019
1 parent f5099d4 commit 9a69395
Show file tree
Hide file tree
Showing 2 changed files with 2 additions and 0 deletions.
1 change: 1 addition & 0 deletions LibOS/shim/src/ipc/shim_ipc_helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");

Expand Down
1 change: 1 addition & 0 deletions LibOS/shim/src/shim_async.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 9a69395

Please sign in to comment.