From: Bodo Stroesser Restoring of current->blocked in sys_sigreturn is wrong. The first (long ) of the mask correctly is fetched from sc->oldmask. The further longs again come from there, but correctly should be taken from frame->extramask. Signed-off-by: Bodo Stroesser --- diff -puN arch/um/sys-i386/signal.c~extramask arch/um/sys-i386/signal.c --- linux-2.6.10-rc2/arch/um/sys-i386/signal.c~extramask 2004-11-26 14:03:10.770096974 +0100 +++ linux-2.6.10-rc2-root/arch/um/sys-i386/signal.c 2004-11-26 14:11:03.264403385 +0100 @@ -307,11 +307,12 @@ long sys_sigreturn(struct pt_regs regs) struct sigframe __user *frame = (struct sigframe *)(sp - 8); sigset_t set; struct sigcontext __user *sc = &frame->sc; - unsigned long __user *mask = &sc->oldmask; + unsigned long __user *oldmask = &sc->oldmask; + unsigned long __user *extramask = &frame->extramask; int sig_size = (_NSIG_WORDS - 1) * sizeof(unsigned long); - if(copy_from_user(&set.sig[0], mask, sizeof(&set.sig[0])) || - copy_from_user(&set.sig[1], mask, sig_size)) + if(copy_from_user(&set.sig[0], oldmask, sizeof(&set.sig[0])) || + copy_from_user(&set.sig[1], extramask, sig_size)) goto segfault; sigdelsetmask(&set, ~_BLOCKABLE); _