Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 9 Mar 2013 09:07:13 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r248092 - head/sys/kern
Message-ID:  <201303090907.r2997DjA086805@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Sat Mar  9 09:07:13 2013
New Revision: 248092
URL: http://svnweb.freebsd.org/changeset/base/248092

Log:
  Rework overflow checks of r247898 to not let too "intelligent" compiler to
  optimize it out.
  
  Submitted by:	bde

Modified:
  head/sys/kern/kern_event.c
  head/sys/kern/sys_generic.c

Modified: head/sys/kern/kern_event.c
==============================================================================
--- head/sys/kern/kern_event.c	Sat Mar  9 08:50:17 2013	(r248091)
+++ head/sys/kern/kern_event.c	Sat Mar  9 09:07:13 2013	(r248092)
@@ -1329,12 +1329,13 @@ kqueue_scan(struct kqueue *kq, int maxev
 			goto done_nl;
 		}
 		if (timespecisset(tsp)) {
-			if (tsp->tv_sec < INT32_MAX) {
+			if (tsp->tv_sec <= INT32_MAX) {
 				rsbt = tstosbt(*tsp);
 				if (TIMESEL(&asbt, rsbt))
 					asbt += tc_tick_sbt;
-				asbt += rsbt;
-				if (asbt < rsbt)
+				if (asbt <= INT64_MAX - rsbt)
+					asbt += rsbt;
+				else
 					asbt = 0;
 				rsbt >>= tc_precexp;
 			} else

Modified: head/sys/kern/sys_generic.c
==============================================================================
--- head/sys/kern/sys_generic.c	Sat Mar  9 08:50:17 2013	(r248091)
+++ head/sys/kern/sys_generic.c	Sat Mar  9 09:07:13 2013	(r248092)
@@ -1051,16 +1051,17 @@ kern_select(struct thread *td, int nd, f
 			error = EINVAL;
 			goto done;
 		}
-		if (rtv.tv_sec == 0 && rtv.tv_usec == 0)
+		if (!timevalisset(&rtv))
 			asbt = 0;
-		else if (rtv.tv_sec < INT32_MAX) {
+		else if (rtv.tv_sec <= INT32_MAX) {
 			rsbt = tvtosbt(rtv);
 			precision = rsbt;
 			precision >>= tc_precexp;
 			if (TIMESEL(&asbt, rsbt))
 				asbt += tc_tick_sbt;
-			asbt += rsbt;
-			if (asbt < rsbt)
+			if (asbt <= INT64_MAX - rsbt)
+				asbt += rsbt;
+			else
 				asbt = -1;
 		} else
 			asbt = -1;



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