Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 21 Aug 2013 14:01:46 -0400
From:      John Baldwin <jhb@freebsd.org>
To:        freebsd-current@freebsd.org, Daniel Eischen <deischen@freebsd.org>
Cc:        Adrian Chadd <adrian@freebsd.org>, Vitja Makarov <vitja.makarov@gmail.com>
Subject:   Re: Question about socket timeouts
Message-ID:  <201308211401.46468.jhb@freebsd.org>
In-Reply-To: <Pine.GSO.4.64.1308192307100.19722@sea.ntplx.net>
References:  <CAKGHGPS=HCYfXxPXuUz5G83j5sGieejPU-QHmi9TrmMhmweHLw@mail.gmail.com> <CAJ-VmokxJvSK1JjEyZ4s9LeX25Lag0ET9nq3bEebM89xOsK1BA@mail.gmail.com> <Pine.GSO.4.64.1308192307100.19722@sea.ntplx.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On Monday, August 19, 2013 11:13:02 pm Daniel Eischen wrote:
> On Mon, 19 Aug 2013, Adrian Chadd wrote:
> 
> > Yes! Please file a PR!
> 
> This sorta implies that both are acceptable (although,
> the Linux behavior seems more desirable).
> 
>    http://austingroupbugs.net/view.php?id=369

No, that says "round up", so it does mean that the requested timeout
should be the minimum amount slept.  tvtohz() does this.  Really odd
that the socket code is using its own version of this rather than
tvtohz().

Oh, I bet this just predates tvtohz().  Interesting that it keeps getting
bug fixes in its history that simply using tvtohz() would have solved.

Try this:

Index: uipc_socket.c
===================================================================
--- uipc_socket.c	(revision 254570)
+++ uipc_socket.c	(working copy)
@@ -2699,21 +2699,16 @@ sosetopt(struct socket *so, struct sockopt *sopt)
 			if (error)
 				goto bad;
 
-			/* assert(hz > 0); */
 			if (tv.tv_sec < 0 || tv.tv_sec > INT_MAX / hz ||
 			    tv.tv_usec < 0 || tv.tv_usec >= 1000000) {
 				error = EDOM;
 				goto bad;
 			}
-			/* assert(tick > 0); */
-			/* assert(ULONG_MAX - INT_MAX >= 1000000); */
-			val = (u_long)(tv.tv_sec * hz) + tv.tv_usec / tick;
-			if (val > INT_MAX) {
+			val = tvtohz(&tv);
+			if (val == INT_MAX) {
 				error = EDOM;
 				goto bad;
 			}
-			if (val == 0 && tv.tv_usec != 0)
-				val = 1;
 
 			switch (sopt->sopt_name) {
 			case SO_SNDTIMEO:


-- 
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201308211401.46468.jhb>