core: Avoid 64bit zero divide.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sat, 6 Oct 2018 22:25:33 +0000 (00:25 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sat, 6 Oct 2018 22:25:33 +0000 (00:25 +0200)
* src/math.c (divide): Avoid (64bit) 0 divide.
(modulo): Likewise.

src/math.c

index b33af93315b032f1efcb87b2cadc201d0c5d98e5..58ba13bebf21ce17ccc55bb48de4e0ab98523dc6 100644 (file)
@@ -128,6 +128,8 @@ divide (SCM x) ///((name . "/") (arity . n))
   while (x != cell_nil)
     {
       assert_number ("divide", CAR (x));
+      if (!n)
+        break;
       n /= VALUE (car (x));
       x = cdr (x);
     }
@@ -140,8 +142,10 @@ modulo (SCM a, SCM b)
   assert_number ("modulo", a);
   assert_number ("modulo", b);
   long x = VALUE (a);
-  while (x < 0) x += VALUE (b);
-  return MAKE_NUMBER (x % VALUE (b));
+  while (x < 0)
+    x += VALUE (b);
+  x = x ? x % VALUE (b) : 0;
+  return MAKE_NUMBER (x);
 }
 
 SCM