shithub: neatroff

Download patch

ref: 3229a5cd02f387a5718a086afefa22d92d87a43f
parent: 2f74eab4dfbc869fbbf2f02388ae91ddb64b9310
author: Ali Gholami Rudi <ali@rudi.ir>
date: Sat Sep 17 13:21:50 EDT 2022

eval: prevent integer overflow for fixed point numbers

--- a/eval.c
+++ b/eval.c
@@ -38,6 +38,10 @@
 	int n = 0;		/* the result */
 	int mag = 0;		/* n should be divided by mag */
 	while (isdigit((unsigned char) *s) || *s == '.') {
+		if (mag == MAXFRAC || (mag > 0 && n > 200000000u)) {
+			s++;
+			continue;
+		}
 		if (*s == '.') {
 			mag = 1;
 			s++;
@@ -45,10 +49,6 @@
 		}
 		mag *= 10;
 		n = n * 10 + *s++ - '0';
-	}
-	if (mag > MAXFRAC) {
-		n /= mag / MAXFRAC;
-		mag /= mag / MAXFRAC;
 	}
 	n = readunit(*s && strchr(SCHAR, *s) ? *s++ : defunit, n);
 	*_s = s;