]> git.eshelyaron.com Git - emacs.git/commitdiff
Reject outlandishly-wide bignums
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 17 Aug 2018 03:44:19 +0000 (20:44 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Fri, 17 Aug 2018 03:45:08 +0000 (20:45 -0700)
Do not allow bignums that are so wide that their log base 2
might not fit into a fixnum, as this will cause problems elsewhere.
We already have a similar limitation for bool-vectors.
* src/emacs.c (check_bignum_size, xmalloc_for_gmp): New function.
(xrealloc_for_gmp): Check for too-large bignum.
(main): Use xmalloc_for_gmp.

src/emacs.c

index 97205d2b2a21d6848e19994477cd8cf5cac66489..11ee0b8118051b2efc759aa60854f7e903d22a6d 100644 (file)
@@ -673,14 +673,32 @@ close_output_streams (void)
     _exit (EXIT_FAILURE);
 }
 
-/* Wrapper function for GMP.  */
+/* Memory allocation functions for GMP.  */
+
+static void
+check_bignum_size (size_t size)
+{
+  /* Do not create a bignum whose log base 2 could exceed fixnum range.
+     This way, functions like mpz_popcount return values in fixnum range.
+     It may also help to avoid other problems with outlandish bignums.  */
+  if (MOST_POSITIVE_FIXNUM / CHAR_BIT < size)
+    error ("Integer too large to be represented");
+}
+
+static void * ATTRIBUTE_MALLOC
+xmalloc_for_gmp (size_t size)
+{
+  check_bignum_size (size);
+  return xmalloc (size);
+}
+
 static void *
 xrealloc_for_gmp (void *ptr, size_t ignore, size_t size)
 {
+  check_bignum_size (size);
   return xrealloc (ptr, size);
 }
 
-/* Wrapper function for GMP.  */
 static void
 xfree_for_gmp (void *ptr, size_t ignore)
 {
@@ -785,7 +803,7 @@ main (int argc, char **argv)
   init_standard_fds ();
   atexit (close_output_streams);
 
-  mp_set_memory_functions (xmalloc, xrealloc_for_gmp, xfree_for_gmp);
+  mp_set_memory_functions (xmalloc_for_gmp, xrealloc_for_gmp, xfree_for_gmp);
 
   sort_args (argc, argv);
   argc = 0;