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;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to