svn commit: r248092 - head/sys/kern

Alexander Motin mav at FreeBSD.org
Sat Mar 9 09:07:14 UTC 2013


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;


More information about the svn-src-all mailing list