]> git.eshelyaron.com Git - emacs.git/commit
Avoid libgmp aborts by imposing limits
authorPaul Eggert <eggert@cs.ucla.edu>
Tue, 21 Aug 2018 09:16:50 +0000 (02:16 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Tue, 21 Aug 2018 09:38:53 +0000 (02:38 -0700)
commitd6a497dd887cdbb35c5b4e2929e83962ba708159
tree9f0441f9fe88419b71e568b05ef7f7bea0a0ff06
parent77fc2725985b4e5ef977ae6930835c7f0771c61c
Avoid libgmp aborts by imposing limits

libgmp calls ‘abort’ when given numbers too big for its
internal data structures.  The numeric limit is large and
platform-dependent; with 64-bit GMP 6.1.2 it is around
2**2**37.  Work around the problem by refusing to call libgmp
functions with arguments that would cause an abort.  With luck
libgmp will have a better way to do this in the future.
Also, introduce a variable integer-width that lets the user
control how large bignums can be.  This currently defaults
to 2**16, i.e., it allows bignums up to 2**2**16.  This
should be enough for ordinary computation, and should
help Emacs to avoid thrashing or hanging.
Problem noted by Pip Cet (Bug#32463#71).
* doc/lispref/numbers.texi, etc/NEWS:
Document recent bignum changes, including this one.
Improve documentation for bitwise operations, in the light
of bignums.
* src/alloc.c (make_number): Enforce integer-width.
(integer_overflow): New function.
(xrealloc_for_gmp, xfree_for_gmp):
Move here from emacs.c, as it's memory allocation.
(init_alloc): Initialize GMP here, rather than in emacs.c.
(integer_width): New var.
* src/data.c (GMP_NLIMBS_MAX, NLIMBS_LIMIT): New constants.
(emacs_mpz_size, emacs_mpz_mul)
(emacs_mpz_mul_2exp, emacs_mpz_pow_ui): New functions.
(arith_driver, Fash, expt_integer): Use them.
(expt_integer): New function, containing integer code
that was out of place in floatfns.c.
(check_bignum_size, xmalloc_for_gmp): Remove.
* src/emacs.c (main): Do not initialize GMP here.
* src/floatfns.c (Fexpt): Use expt_integer, which
now contains integer code moved from here.
* src/lisp.h (GMP_NUMB_BITS): Define if gmp.h doesn’t.
doc/lispref/numbers.texi
etc/NEWS
src/alloc.c
src/data.c
src/emacs.c
src/floatfns.c
src/lisp.h