Skip site navigation (1)Skip section navigation (2)
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>