kern/149980: [patch] negative value integer to nanosleep(2) should fail with EINVAL

Garrett Cooper gcooper at FreeBSD.org
Sun Aug 29 20:20:05 UTC 2010


The following reply was made to PR kern/149980; it has been noted by GNATS.

From: Garrett Cooper <gcooper at FreeBSD.org>
To: Garrett Cooper <gcooper at freebsd.org>
Cc: vwe at freebsd.org, bug-followup <bug-followup at freebsd.org>
Subject: Re: kern/149980: [patch] negative value integer to nanosleep(2)
 should fail with EINVAL
Date: Sun, 29 Aug 2010 13:17:44 -0700

 On Sun, Aug 29, 2010 at 1:16 PM, Garrett Cooper <gcooper at freebsd.org> wrote=
 :
 > On Sun, Aug 29, 2010 at 1:03 PM, =A0<vwe at freebsd.org> wrote:
 >> Old Synopsis: [PATCH] negative value integer to nanosleep(2) should fail=
  with EINVAL
 >> New Synopsis: [patch] negative value integer to nanosleep(2) should fail=
  with EINVAL
 >>
 >> State-Changed-From-To: open->analyzed
 >> State-Changed-By: vwe
 >> State-Changed-When: Sun Aug 29 20:00:22 UTC 2010
 >> State-Changed-Why:
 >> double checked that and it's looking reasonable
 >> I think the checks for 'tv_nsec < 0' and 'tv_sec < 0' can be made in one=
  go,
 >> but IMO it should not make a difference (assembler wise):
 >>
 >> Index: sys/kern/kern_time.c
 >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
 >> --- sys/kern/kern_time.c =A0 =A0 =A0 =A0(revision 211522)
 >> +++ sys/kern/kern_time.c =A0 =A0 =A0 =A0(working copy)
 >> @@ -362,9 +362,9 @@
 >> =A0 =A0 =A0 =A0struct timeval tv;
 >> =A0 =A0 =A0 =A0int error;
 >>
 >> - =A0 =A0 =A0 if (rqt->tv_nsec < 0 || rqt->tv_nsec >=3D 1000000000)
 >> + =A0 =A0 =A0 if (rqt->tv_nsec < 0 || rqt->tv_nsec >=3D 1000000000 || rq=
 t->tv_sec < 0)
 >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return (EINVAL);
 >> - =A0 =A0 =A0 if (rqt->tv_sec < 0 || (rqt->tv_sec =3D=3D 0 && rqt->tv_ns=
 ec =3D=3D 0))
 >> + =A0 =A0 =A0 if (rqt->tv_sec =3D=3D 0 && rqt->tv_nsec =3D=3D 0)
 >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return (0);
 >> =A0 =A0 =A0 =A0getnanouptime(&ts);
 >> =A0 =A0 =A0 =A0timespecadd(&ts, rqt);
 >
 > Same thing that bde@ asked me to create, so it naturally looks good :).
 >
 > The reason why I hadn't posted anything earlier about this bug is that
 > bde@ brought it to my attention that there are additional issues with
 > the timer code, mostly dealing with the fact that itimerfix isn't used
 > when checking the bounds of the tv argument. There are other
 > associated issues with using this though (itimerfix checks tv_msec,
 > and nanosleep doesn't check the tv_msec field because nanosleep uses
 > nanosecond granularity, not millisecond granularity).
 
 One other thing that I failed to mention. itimerfix is used as a
 one-size fit-all solution in a lot of of pieces of code, s.t. it would
 affect other items like select(2), etc.
 -Garrett


More information about the freebsd-bugs mailing list