From owner-freebsd-current Thu Dec 18 20:55:56 1997 Return-Path: Received: (from root@localhost) by hub.freebsd.org (8.8.7/8.8.7) id UAA21838 for current-outgoing; Thu, 18 Dec 1997 20:55:56 -0800 (PST) (envelope-from owner-freebsd-current) Received: from fredriks-1.pr.mcs.net (fredriks-1.pr.mcs.net [205.164.50.241]) by hub.freebsd.org (8.8.7/8.8.7) with ESMTP id UAA21718; Thu, 18 Dec 1997 20:53:17 -0800 (PST) (envelope-from lars@fredriks-1.pr.mcs.net) Received: (from lars@localhost) by fredriks-1.pr.mcs.net (8.8.8/8.8.8) id WAA17100; Thu, 18 Dec 1997 22:53:16 -0600 (CST) (envelope-from lars) From: Lars Fredriksen Message-Id: <199712190453.WAA17100@fredriks-1.pr.mcs.net> Subject: Re: EDOM and hz In-Reply-To: <199712190202.SAA11500@hub.freebsd.org> from "Jonathan M. Bresler" at "Dec 18, 97 06:02:44 pm" To: jmb@FreeBSD.ORG (Jonathan M. Bresler) Date: Thu, 18 Dec 1997 22:53:15 -0600 (CST) Cc: current@FreeBSD.ORG X-Mailer: ELM [version 2.4ME+ PL28 (25)] MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: owner-freebsd-current@FreeBSD.ORG X-Loop: FreeBSD.org Precedence: bulk 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) > > > > 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)