Print this page
OS-4470 lxbrand unblocking signals in new threads must be atomic

*** 1555,1567 **** /* * 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; /* * 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 --- 1555,1567 ---- /* * 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 = 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,1819 **** 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)); } - } assert(0); after_signal_handler: /* * Ensure all nested signal handlers have completed correctly * and then remove our stack reservation. --- 1803,1817 ---- 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 ! 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.