Print this page
OS-4470 lxbrand unblocking signals in new threads must be atomic
@@ -1555,13 +1555,13 @@
/*
* These variables must be "volatile", as they are modified after the
* getcontext() stores the register state:
*/
volatile boolean_t signal_delivered = B_FALSE;
- volatile uintptr_t lxfp;
- volatile uintptr_t old_tsd_sp;
- volatile int newstack;
+ volatile uintptr_t lxfp = 0;
+ volatile uintptr_t old_tsd_sp = 0;
+ volatile int newstack = 0;
/*
* This function involves modifying the Linux process stack for this
* thread. To do so without corruption requires us to exclude other
* signal handlers (or emulated system calls called from within those
@@ -1803,17 +1803,15 @@
LX_REG(&jump_uc, REG_RDI) = hargs[0];
LX_REG(&jump_uc, REG_RSI) = hargs[1];
LX_REG(&jump_uc, REG_RDX) = hargs[2];
#endif
- if (syscall(SYS_brand, B_JUMP_TO_LINUX, &jump_uc) == -1) {
- lx_err_fatal("B_JUMP_TO_LINUX failed: %s",
- strerror(errno));
+ lx_jump_to_linux(&jump_uc);
}
- }
assert(0);
+ abort();
after_signal_handler:
/*
* Ensure all nested signal handlers have completed correctly
* and then remove our stack reservation.