From: Paul Eggert Date: Sun, 21 Jul 2019 18:20:07 +0000 (-0700) Subject: pure_alloc returns cleared memory X-Git-Tag: emacs-27.0.90~1827 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=4a1507b88e813e3d54614f4cb59211234e05334a;p=emacs.git pure_alloc returns cleared memory * src/alloc.c (pure_alloc): Clear any heap-allocated storage. This is simpler than auditing all the callers to make sure they don’t assume pure memory is cleared memory, and the performance implication is nonexistent except when Emacs is misconfigured. Also, add an assertion to catch caller misuse when pure space is exhausted. --- diff --git a/src/alloc.c b/src/alloc.c index 1718ce0fafc..b7ba886482e 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -5086,7 +5086,13 @@ valid_lisp_object_p (Lisp_Object obj) /* Allocate room for SIZE bytes from pure Lisp storage and return a pointer to it. TYPE is the Lisp type for which the memory is allocated. TYPE < 0 means it's not used for a Lisp object, - and that the result should have an alignment of -TYPE. */ + and that the result should have an alignment of -TYPE. + + The bytes are initially zero. + + If pure space is exhausted, allocate space from the heap. This is + merely an expedient to let Emacs warn that pure space was exhausted + and that Emacs should be rebuilt with a larger pure space. */ static void * pure_alloc (size_t size, int type) @@ -5119,8 +5125,10 @@ pure_alloc (size_t size, int type) /* Don't allocate a large amount here, because it might get mmap'd and then its address might not be usable. */ - purebeg = xmalloc (10000); - pure_size = 10000; + int small_amount = 10000; + eassert (size <= small_amount - LISP_ALIGNMENT); + purebeg = xzalloc (small_amount); + pure_size = small_amount; pure_bytes_used_before_overflow += pure_bytes_used - size; pure_bytes_used = 0; pure_bytes_used_lisp = pure_bytes_used_non_lisp = 0;