Date: Thu, 18 Dec 1997 22:53:15 -0600 (CST) From: Lars Fredriksen <lars@fredriks-1.pr.mcs.net> To: jmb@FreeBSD.ORG (Jonathan M. Bresler) Cc: current@FreeBSD.ORG Subject: Re: EDOM and hz Message-ID: <199712190453.WAA17100@fredriks-1.pr.mcs.net> In-Reply-To: <199712190202.SAA11500@hub.freebsd.org> from "Jonathan M. Bresler" at "Dec 18, 97 06:02:44 pm"
next in thread | previous in thread | raw e-mail | index | archive | help
Jonathan M. Bresler writes:
> Lars Fredriksen wrote:
> >
> > Hi,
> >
> > This is a section of code in uipc_socket.c:
> >
> > case SO_SNDTIMEO:
> > case SO_RCVTIMEO:
> > {
> > struct timeval *tv;
> > short val;
> >
> > if (m == NULL || m->m_len < sizeof (*tv)) {
> > error = EINVAL;
> > goto bad;
> > }
> > tv = mtod(m, struct timeval *);
> > if (tv->tv_sec > SHRT_MAX / hz - hz) {
> > error = EDOM;
> > goto bad;
> > }
> > val = tv->tv_sec * hz + tv->tv_usec / tick;
> >
> >
> > If we are running with hz anything but 100 this code sort of breaks.
> >
> > That is:
> >
> > 32767/100-100 = 227
> >
> > but
> > 32767/250-250 = -119
> >
> >
> > Can we modify this check in such a fashion that works more universally?
> >
> > Perhaps by changing val to an int??
> >
> > and make it:
> > if (tv->tv_sec > INT_MAX/hz -hz)
>
> <hmmm....better grab stevens v2....ah, let's see on p 543,4>
>
> Rich Stevens recommends:
>
> if (tv->tv_sec*hz + tv_usec/tick > SHRT_MAX) {
> error = EDOM;
> goto bad;
> }
>
>
> where tick = 1,000,000 / hz
> and SHRT_MAX = 32767
> jmb
>
Looks like a winner to me! Anyone care to commit - or I can. Just
say the word..
Lars
--
-------------------------------------------------------------------
Lars Fredriksen fredriks@mcs.com (home)
lars@fredriks-1.pr.mcs.net (home-home)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199712190453.WAA17100>
