Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 21 May 2016 11:10:52 +1000 (EST)
From:      Bruce Evans <brde@optusnet.com.au>
To:        Conrad Meyer <cem@freebsd.org>
Cc:        Konstantin Belousov <kib@freebsd.org>, src-committers@freebsd.org,  svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r300332 - in head/sys: amd64/amd64 i386/i386
Message-ID:  <20160521103528.I1539@besplex.bde.org>
In-Reply-To: <CAG6CVpUtz49L0VWfPcCXFvEMiV41AwxhJ8tGjenLqgPJt_kpyA@mail.gmail.com>
References:  <201605201950.u4KJoWA5028092@repo.freebsd.org> <20160521081930.I1098@besplex.bde.org> <CAG6CVpUtz49L0VWfPcCXFvEMiV41AwxhJ8tGjenLqgPJt_kpyA@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, 20 May 2016, Conrad Meyer wrote:

> On Fri, May 20, 2016 at 4:02 PM, Bruce Evans <brde@optusnet.com.au> wrote:
>> On Fri, 20 May 2016, Konstantin Belousov wrote:
>>
>>> --- head/sys/i386/i386/sys_machdep.c    Fri May 20 19:46:25 2016
>>> (r300331)
>>> +++ head/sys/i386/i386/sys_machdep.c    Fri May 20 19:50:32 2016
>>> (r300332)
>>> @@ -315,8 +315,9 @@ i386_set_ioperm(td, uap)
>>>         struct thread *td;
>>>         struct i386_ioperm_args *uap;
>>> {
>>> -       int i, error;
>>>         char *iomap;
>>> +       u_int i;
>>> +       int error;
>>>
>>>         if ((error = priv_check(td, PRIV_IO)) != 0)
>>>                 return (error);
>>> @@ -334,7 +335,8 @@ i386_set_ioperm(td, uap)
>>>                         return (error);
>>>         iomap = (char *)td->td_pcb->pcb_ext->ext_iomap;
>>>
>>> -       if (uap->start + uap->length > IOPAGES * PAGE_SIZE * NBBY)
>>> +       if (uap->start > uap->start + uap->length ||
>>> +           uap->start + uap->length > IOPAGES * PAGE_SIZE * NBBY)
>>>                 return (EINVAL);
>>>
>>>         for (i = uap->start; i < uap->start + uap->length; i++) {
>>
>> I don't like using u_int for a small index.
>
> Why not?  Indices are by definition non-negative so the fit seems natural.

Signed integers are easier to understand provided calculations with them
don't overflow.  Unsigned integers are not easier to understand if
calculations with them do overflow.  That was the case here.

Only indices relative to the base of an array are by definition
non-negative.  For an array a[], it is valid to do p = &a[i] and then
use p[j] with negative j to get back before the i'th index.  This is
sometimes useful.  i + j must be >= 0, but is hard write correctly and
understand if either i or j is unsigned.  (It can be arranged that the
addition wraps correctly, but this is basically re-implementing signed
arithmetic.)

>> After the bounds checking
>> fix, the range fits in a small signed integer.  However, uap->start
>> and uap->length already use bad type u_int, so it is natural to keep
>> using that type.
>
> What's bad about it?

Unsigned in the API gives unsigned poisoning when the API is used.

The API would have needed unsigneds to cover the i386 i/o range of
64K using 16-bit ints, but since we never supported 16-bit ints and
POSI now requires 32-bit ints, we shouldn't have the complications
from that.

Bruce



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