Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 6 Dec 2003 20:13:48 -0800 (PST)
From:      Matthew Dillon <dillon@apollo.backplane.com>
To:        stable@freebsd.org
Subject:   Bug in i386/i386/trap.c %gs handling on stable
Message-ID:  <200312070413.hB74Dm7g058674@apollo.backplane.com>

next in thread | raw e-mail | index | archive | help
In i386/i386/trap.c if %gs is invalid... for example, a process with a 
USER_LDT takes an interrupt while exiting, or if %gs is set through procfs,
the fault check must occur regardless of the interrupt nesting level because
mainline code does not push and load a %gs for the kernel. 

FreeBSD-5.x has already moved this check to outside the nesting level test.

It may also be possible that %fs can cause the same problem to occur in
the situation with a process takes an interrupt while exiting and %fs is
set to a USER_LDT entry.  I have not checked this, but if it is true it would
be a problem in both -current and -stable for the exiting case.


    if (intr_nesting_level == 0) {
	    /*
	     * Invalid %fs's and %gs's can be created using
	     * procfs or PT_SETREGS or by invalidating the
	     * underlying LDT entry.  This causes a fault
	     * in kernel mode when the kernel attempts to
	     * switch contexts.  Lose the bad context
	     * (XXX) so that we can continue, and generate
	     * a signal.
	     */
	    if (frame.tf_eip == (int)cpu_switch_load_gs) {   	<<< WRONG
		    curpcb->pcb_gs = 0;   			<<<
		    psignal(p, SIGBUS);				<<<
		    return;					<<<
	    }
	    MAYBE_DORETI_FAULT(doreti_iret,
			       doreti_iret_fault);





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200312070413.hB74Dm7g058674>