Date: Thu, 18 Dec 1997 18:02:44 -0800 (PST) From: "Jonathan M. Bresler" <jmb> To: lars@fredriks-1.pr.mcs.net (Lars Fredriksen) Cc: current@freebsd.org Subject: Re: EDOM and hz Message-ID: <199712190202.SAA11500@hub.freebsd.org> In-Reply-To: <199712181552.JAA03716@fredriks-1.pr.mcs.net> from "Lars Fredriksen" at Dec 18, 97 09:52:27 am
next in thread | previous in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199712190202.SAA11500>
