Re: NVidia glx stuff dies in sysarch(I386_SET_LDT, ...)

From: Julian Elischer <julian_at_elischer.org>
Date: Fri, 1 Aug 2003 15:17:12 -0700 (PDT)
On Fri, 1 Aug 2003, Daniel Eischen wrote:

> On Fri, 1 Aug 2003, Thorsten Greiner wrote:
> 
> > * Thorsten Greiner <thorsten.greiner_at_web.de> [2003-08-01 23:47]:
> > > I will test wether the problem still occurs with version 1.84 of
> > > sys_machdep.c and let you know.
> > 
> > Yup, reverting to 1.84 unbreaks this for me. Looking at the changes
> > made it appears to me that the check
> > 
> >         if (uap->start < NLDT || uap->num <= 0)
> >             return (EINVAL);i
> > 
> > causes this, because NLDT is 6 and the NVidia stuff passes
> > uap->start == 6 to this call.
> 
> It can't use 6.  FreeBSD reserves 0-16 for its own use.
> 
> I think the bug was in the old code allowing this to
> happen...

Looking at segments.h.....
/*
 * Entries in the Local Descriptor Table (LDT)
 */
#define LSYS5CALLS_SEL  0       /* forced by intel BCS */
#define LSYS5SIGR_SEL   1
#define L43BSDCALLS_SEL 2       /* notyet */
#define LUCODE_SEL      3
#define LSOL26CALLS_SEL 4       /* Solaris >= 2.6 system call gate */
#define LUDATA_SEL      5
/* separate stack, es,fs,gs sels ? */
/* #define      LPOSIXCALLS_SEL 5*/     /* notyet */
#define LBSDICALLS_SEL  16      /* BSDI system call gate */
#define NLDT            (LBSDICALLS_SEL + 1)

it looks like NLDT should be save between from 6 to 15
(though I wish they'd chosen a different value)

so we could add:

if ((uap->start == LBSDICALLS_SEL) || (uap->start <= LUDATA_SEL)) ||
    (uap->num <= 0))
...

What do you think?

> 
> -- 
> Dan Eischen
> 
> 
Received on Fri Aug 01 2003 - 13:17:16 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:37:17 UTC