]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix (round 1e+INF) core dump
authorPaul Eggert <eggert@cs.ucla.edu>
Tue, 11 Sep 2018 18:30:48 +0000 (11:30 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Tue, 11 Sep 2018 18:34:44 +0000 (11:34 -0700)
* src/bignum.c (double_to_integer): Signal an error
if D cannot be converted, instead of dumping core.
* test/src/floatfns-tests.el (special-round): New test.

src/bignum.c
test/src/floatfns-tests.el

index 2da2c961c47758072a5da5fd6e598d93e0a87032..5e86c404b70a6e2cddc30fc8200b2afa80722cdb 100644 (file)
@@ -23,6 +23,7 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include "lisp.h"
 
+#include <math.h>
 #include <stdlib.h>
 
 /* mpz global temporaries.  Making them global saves the trouble of
@@ -64,10 +65,13 @@ bignum_to_double (Lisp_Object n)
   return mpz_get_d (XBIGNUM (n)->value);
 }
 
-/* Return D, converted to a Lisp integer.  Discard any fraction.  */
+/* Return D, converted to a Lisp integer.  Discard any fraction.
+   Signal an error if D cannot be converted.  */
 Lisp_Object
 double_to_integer (double d)
 {
+  if (!isfinite (d))
+    overflow_error ();
   mpz_set_d (mpz[0], d);
   return make_integer_mpz ();
 }
index 9a382058b4349400cc67aa2ab450d6f0d1986819..3dcddc7f26bd355a90c88d375a76d755e3703d8f 100644 (file)
                       (or (/= cdelta fdelta)
                           (zerop (% (round n d) 2)))))))))))
 
+(ert-deftest special-round ()
+  (let ((ns '(-1e+INF 1e+INF -1 1 -1e+NaN 1e+NaN)))
+    (dolist (n ns)
+      (unless (<= (abs n) 1)
+        (should-error (ceiling n))
+        (should-error (floor n))
+        (should-error (round n))
+        (should-error (truncate n)))
+      (dolist (d ns)
+        (unless (<= (abs (/ n d)) 1)
+          (should-error (ceiling n d))
+          (should-error (floor n d))
+          (should-error (round n d))
+          (should-error (truncate n d)))))))
+
 (provide 'floatfns-tests)