Don't bogusly save the supervisor stack on signals. Correct PSL checks. Fix

some return values from sigreturn().
This commit is contained in:
mycroft 1994-01-09 14:59:42 +00:00
parent 4eb1bbfb0b
commit f8154a63c0
1 changed files with 11 additions and 12 deletions

View File

@ -452,7 +452,6 @@ sendsig(catcher, sig, mask, code)
fp->sf_sc.sc_mask = mask;
fp->sf_sc.sc_ebp = tf->tf_ebp;
fp->sf_sc.sc_esp = tf->tf_esp;
fp->sf_sc.sc_isp = tf->tf_isp;
fp->sf_sc.sc_eip = tf->tf_eip;
fp->sf_sc.sc_efl = tf->tf_eflags;
fp->sf_sc.sc_eax = tf->tf_eax;
@ -500,6 +499,7 @@ sigreturn(p, uap, retval)
register struct sigcontext *scp;
register struct sigframe *fp;
register struct trapframe *tf;
int eflags;
tf = (struct trapframe *)p->p_regs;
@ -513,19 +513,18 @@ sigreturn(p, uap, retval)
((caddr_t)scp - offsetof(struct sigframe, sf_sc));
if (useracc((caddr_t)fp, sizeof(*fp), 0) == 0)
return(EINVAL);
return(EFAULT);
if (useracc((caddr_t)scp, sizeof(*scp), 0) == 0)
return(EFAULT);
eflags = scp->sc_efl;
if ((eflags & PSL_USERCLR) != 0 ||
(eflags & PSL_USERSET) != PSL_USERSET ||
(eflags & PSL_IOPL) > (tf->tf_eflags & PSL_IOPL))
return(EINVAL);
/* make sure they aren't trying to do anything funny */
if ((scp->sc_ps & PSL_MBZ) != 0 || (scp->sc_ps & PSL_MBO) != PSL_MBO)
return(EINVAL);
/* compare IOPL; we can't insist that it's always 3 or the X server
will fail */
if ((tf->tf_eflags & PSL_IOPL) < (scp->sc_efl & PSL_IOPL))
return(EINVAL);
/* XXXXXX NEED TO VALIDATE SEGMENT REGISTERS */
p->p_sigacts->ps_onstack = scp->sc_onstack & 01;
p->p_sigmask = scp->sc_mask &~
@ -536,9 +535,8 @@ sigreturn(p, uap, retval)
*/
tf->tf_ebp = scp->sc_ebp;
tf->tf_esp = scp->sc_esp;
tf->tf_isp = scp->sc_isp;
tf->tf_eip = scp->sc_eip;
tf->tf_eflags = scp->sc_efl;
tf->tf_eflags = eflags;
tf->tf_eax = scp->sc_eax;
tf->tf_ebx = scp->sc_ebx;
tf->tf_ecx = scp->sc_ecx;
@ -549,6 +547,7 @@ sigreturn(p, uap, retval)
tf->tf_ds = scp->sc_ds;
tf->tf_es = scp->sc_es;
tf->tf_ss = scp->sc_ss;
return(EJUSTRETURN);
}