From owner-freebsd-current Thu Dec 18 18:02:53 1997 Return-Path: Received: (from root@localhost) by hub.freebsd.org (8.8.7/8.8.7) id SAA11509 for current-outgoing; Thu, 18 Dec 1997 18:02:53 -0800 (PST) (envelope-from owner-freebsd-current) Received: (from jmb@localhost) by hub.freebsd.org (8.8.7/8.8.7) id SAA11500; Thu, 18 Dec 1997 18:02:45 -0800 (PST) (envelope-from jmb) From: "Jonathan M. Bresler" Message-Id: <199712190202.SAA11500@hub.freebsd.org> Subject: Re: EDOM and hz To: lars@fredriks-1.pr.mcs.net (Lars Fredriksen) Date: Thu, 18 Dec 1997 18:02:44 -0800 (PST) Cc: current@freebsd.org In-Reply-To: <199712181552.JAA03716@fredriks-1.pr.mcs.net> from "Lars Fredriksen" at Dec 18, 97 09:52:27 am X-Mailer: ELM [version 2.4 PL24] Content-Type: text Sender: owner-freebsd-current@freebsd.org X-Loop: FreeBSD.org Precedence: bulk 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) 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