diff -r c44538397385 mini-gmp/mini-gmp.c
--- a/mini-gmp/mini-gmp.c	Wed Feb 12 20:48:35 2020 +0100
+++ b/mini-gmp/mini-gmp.c	Sat Feb 22 05:55:00 2020 -0500
@@ -361,10 +361,11 @@
 }
 
 static mp_ptr
-gmp_xrealloc_limbs (mp_ptr old, mp_size_t size)
+gmp_xrealloc_limbs (mp_ptr old, mp_size_t old_size, mp_size_t size)
 {
+  const size_t sl = sizeof (mp_limb_t);
   assert (size > 0);
-  return (mp_ptr) (*gmp_reallocate_func) (old, 0, size * sizeof (mp_limb_t));
+  return (mp_ptr) (*gmp_reallocate_func) (old, old_size * sl, size * sl);
 }
 
 
@@ -1444,7 +1445,7 @@
   size = GMP_MAX (size, 1);
 
   if (r->_mp_alloc)
-    r->_mp_d = gmp_xrealloc_limbs (r->_mp_d, size);
+    r->_mp_d = gmp_xrealloc_limbs (r->_mp_d, r->_mp_alloc, size);
   else
     r->_mp_d = gmp_xalloc_limbs (size);
   r->_mp_alloc = size;
diff -r c44538397385 mini-gmp/mini-mpq.c
--- a/mini-gmp/mini-mpq.c	Wed Feb 12 20:48:35 2020 +0100
+++ b/mini-gmp/mini-mpq.c	Sat Feb 22 05:55:00 2020 -0500
@@ -498,7 +498,7 @@
 
     mp_get_memory_functions (NULL, &gmp_reallocate_func, &gmp_free_func);
     lden = strlen (rden) + 1;
-    res = (char *) gmp_reallocate_func (res, 0, (lden + len) * sizeof (char));
+    res = (char *) gmp_reallocate_func (res, len, (lden + len) * sizeof (char));
     memcpy (res + len, rden, lden);
     gmp_free_func (rden, 0);
   }
diff -r c44538397385 mini-gmp/tests/testutils.c
--- a/mini-gmp/tests/testutils.c	Wed Feb 12 20:48:35 2020 +0100
+++ b/mini-gmp/tests/testutils.c	Sat Feb 22 05:55:00 2020 -0500
@@ -84,15 +84,21 @@
 static void *
 tu_realloc (void *p, size_t old_size, size_t new_size)
 {
-  size_t *block = block_check (p);
-  block = (size_t *) realloc (block, sizeof(size_t) + new_size + sizeof(block_end));
+  size_t *old_block = block_check (p), *block;
+  void *new;
+  /* We do not use realloc here to test custom allocators where realloc
+     requires old_size to be set to the length of data that needs to be
+     copied from old to the newly allocated space. */
+  block = (size_t *) malloc (sizeof(size_t) + new_size + sizeof(block_end));
   if (!block)
     {
       fprintf (stderr, "Virtual memory exhausted.\n");
       abort ();
     }
-
-  return block_init (block, new_size);
+  new = block_init (block, new_size);
+  memcpy (new, p, GMP_MIN(old_size, new_size));
+  free (old_block);
+  return new;
 }
 
 static void
