⬢ DragonFlyBSD Kernel Audit
DF-5580 / fix.diff
← back to finding ↓ download raw
--- a/sys/platform/pc64/x86_64/__udivti3.c
+++ b/sys/platform/pc64/x86_64/__udivti3.c
@@ -228,20 +228,26 @@
 			 *     r.s.low = n.s.high >> (sr - n_udword_bits);
 			 * }
 			 */
-			q.s.low =  (n.s.low << (n_utword_bits - sr)) &
-			    ((long)(int)(n_udword_bits - sr) >> (n_udword_bits-1));
-			q.s.high = ((n.s.low << ( n_udword_bits - sr)) &
-			    ((long)(int)(sr - n_udword_bits - 1) >> (n_udword_bits-1))) |
-			    (((n.s.high << (n_utword_bits - sr)) |
-				(n.s.low >> (sr - n_udword_bits))) &
-				((long)(int)(n_udword_bits - sr) >> (n_udword_bits-1)));
-			r.s.high = (n.s.high >> sr) &
-			    ((long)(int)(sr - n_udword_bits) >> (n_udword_bits-1));
-			r.s.low =  ((n.s.high >> (sr - n_udword_bits)) &
-			    ((long)(int)(n_udword_bits - sr - 1) >> (n_udword_bits-1))) |
-			    (((n.s.high << (n_udword_bits - sr)) |
-				(n.s.low >> sr)) &
-				((long)(int)(sr - n_udword_bits) >> (n_udword_bits-1)));
+			if (sr == n_udword_bits) {
+				q.s.low = 0;
+				q.s.high = n.s.low;
+				r.s.high = 0;
+				r.s.low = n.s.high;
+			} else if (sr < n_udword_bits) {
+				/* 2 <= sr <= n_udword_bits - 1 */
+				q.s.low = 0;
+				q.s.high = n.s.low << (n_udword_bits - sr);
+				r.s.high = n.s.high >> sr;
+				r.s.low = (n.s.high << (n_udword_bits - sr)) |
+				    (n.s.low >> sr);
+			} else {
+				/* n_udword_bits + 1 <= sr <= n_utword_bits - 1 */
+				q.s.low = n.s.low << (n_utword_bits - sr);
+				q.s.high = (n.s.high << (n_utword_bits - sr)) |
+				    (n.s.low >> (sr - n_udword_bits));
+				r.s.high = 0;
+				r.s.low = n.s.high >> (sr - n_udword_bits);
+			}
 		} else {
 			/* K X
 			 * ---
@@ -271,11 +277,14 @@
 			 *     r.s.low = n.s.high;
 			 * }
 			 */
-			r.s.high = (n.s.high >> sr) &
-			    ((long)(int)(sr - n_udword_bits) >> (n_udword_bits-1));
-			r.s.low = (n.s.high << (n_udword_bits - sr)) |
-			    ((n.s.low >> sr) &
-				((long)(int)(sr - n_udword_bits) >> (n_udword_bits-1)));
+			if (sr < n_udword_bits) {
+				r.s.high = n.s.high >> sr;
+				r.s.low = (n.s.high << (n_udword_bits - sr)) |
+				    (n.s.low >> sr);
+			} else {
+				r.s.high = 0;
+				r.s.low = n.s.high;
+			}
 		}
 	}
 	/* Not a special case