Memory debug: do not try to save allocation bytes used for debug as ACL can modify...
[exim.git] / src / src / store.c
1 /*************************************************
2 *     Exim - an Internet mail transport agent    *
3 *************************************************/
4
5 /* Copyright (c) University of Cambridge 1995 - 2018 */
6 /* Copyright (c) The Exim maintainers 2019 - 2020 */
7 /* See the file NOTICE for conditions of use and distribution. */
8
9 /* Exim gets and frees all its store through these functions. In the original
10 implementation there was a lot of mallocing and freeing of small bits of store.
11 The philosophy has now changed to a scheme which includes the concept of
12 "stacking pools" of store. For the short-lived processes, there isn't any real
13 need to do any garbage collection, but the stack concept allows quick resetting
14 in places where this seems sensible.
15
16 Obviously the long-running processes (the daemon, the queue runner, and eximon)
17 must take care not to eat store.
18
19 The following different types of store are recognized:
20
21 . Long-lived, large blocks: This is implemented by retaining the original
22   malloc/free functions, and it used for permanent working buffers and for
23   getting blocks to cut up for the other types.
24
25 . Long-lived, small blocks: This is used for blocks that have to survive until
26   the process exits. It is implemented as a stacking pool (POOL_PERM). This is
27   functionally the same as store_malloc(), except that the store can't be
28   freed, but I expect it to be more efficient for handling small blocks.
29
30 . Short-lived, short blocks: Most of the dynamic store falls into this
31   category. It is implemented as a stacking pool (POOL_MAIN) which is reset
32   after accepting a message when multiple messages are received by a single
33   process. Resetting happens at some other times as well, usually fairly
34   locally after some specific processing that needs working store.
35
36 . There is a separate pool (POOL_SEARCH) that is used only for lookup storage.
37   This means it can be freed when search_tidyup() is called to close down all
38   the lookup caching.
39
40 - There is another pool (POOL_MESSAGE) used for medium-lifetime objects; within
41   a single message transaction but needed for longer than the use of the main
42   pool permits.  Currently this means only receive-time DKIM information.
43
44 . Orthogonal to the three pool types, there are two classes of memory: untainted
45   and tainted.  The latter is used for values derived from untrusted input, and
46   the string-expansion mechanism refuses to operate on such values (obviously,
47   it can expand an untainted value to return a tainted result).  The classes
48   are implemented by duplicating the four pool types.  Pool resets are requested
49   against the nontainted sibling and apply to both siblings.
50
51   Only memory blocks requested for tainted use are regarded as tainted; anything
52   else (including stack auto variables) is untainted.  Care is needed when coding
53   to not copy untrusted data into untainted memory, as downstream taint-checks
54   would be avoided.
55
56   Intermediate layers (eg. the string functions) can test for taint, and use this
57   for ensurinng that results have proper state.  For example the
58   string_vformat_trc() routing supporting the string_sprintf() interface will
59   recopy a string being built into a tainted allocation if it meets a %s for a
60   tainted argument.  Any intermediate-layer function that (can) return a new
61   allocation should behave this way; returning a tainted result if any tainted
62   content is used.  Intermediate-layer functions (eg. Ustrncpy) that modify
63   existing allocations fail if tainted data is written into an untainted area.
64   Users of functions that modify existing allocations should check if a tainted
65   source and an untainted destination is used, and fail instead (sprintf() being
66   the classic case).
67 */
68
69
70 #include "exim.h"
71 /* keep config.h before memcheck.h, for NVALGRIND */
72 #include "config.h"
73
74 #include <sys/mman.h>
75 #include "memcheck.h"
76
77
78 /* We need to know how to align blocks of data for general use. I'm not sure
79 how to get an alignment factor in general. In the current world, a value of 8
80 is probably right, and this is sizeof(double) on some systems and sizeof(void
81 *) on others, so take the larger of those. Since everything in this expression
82 is a constant, the compiler should optimize it to a simple constant wherever it
83 appears (I checked that gcc does do this). */
84
85 #define alignment \
86   (sizeof(void *) > sizeof(double) ? sizeof(void *) : sizeof(double))
87
88 /* store_reset() will not free the following block if the last used block has
89 less than this much left in it. */
90
91 #define STOREPOOL_MIN_SIZE 256
92
93 /* Structure describing the beginning of each big block. */
94
95 typedef struct storeblock {
96   struct storeblock *next;
97   size_t length;
98 } storeblock;
99
100 /* Just in case we find ourselves on a system where the structure above has a
101 length that is not a multiple of the alignment, set up a macro for the padded
102 length. */
103
104 #define ALIGNED_SIZEOF_STOREBLOCK \
105   (((sizeof(storeblock) + alignment - 1) / alignment) * alignment)
106
107 /* Size of block to get from malloc to carve up into smaller ones. This
108 must be a multiple of the alignment. We assume that 4096 is going to be
109 suitably aligned.  Double the size per-pool for every malloc, to mitigate
110 certain denial-of-service attacks.  Don't bother to decrease on block frees.
111 We waste average half the current alloc size per pool.  This could be several
112 hundred kB now, vs. 4kB with a constant-size block size.  But the search time
113 for is_tainted(), linear in the number of blocks for the pool, is O(n log n)
114 rather than O(n^2).
115 A test of 2000 RCPTs and just accept ACL had 370kB in 21 blocks before,
116 504kB in 6 blocks now, for the untainted-main (largest) pool.
117 Builds for restricted-memory system can disable the expansion by
118 defining RESTRICTED_MEMORY */
119 /*XXX should we allow any for malloc's own overhead?  But how much? */
120
121 /* #define RESTRICTED_MEMORY */
122 #define STORE_BLOCK_SIZE(order) ((1U << (order)) - ALIGNED_SIZEOF_STOREBLOCK)
123
124 /* Variables holding data for the local pools of store. The current pool number
125 is held in store_pool, which is global so that it can be changed from outside.
126 Setting the initial length values to -1 forces a malloc for the first call,
127 even if the length is zero (which is used for getting a point to reset to). */
128
129 int store_pool = POOL_MAIN;
130
131 static storeblock *chainbase[NPOOLS];
132 static storeblock *current_block[NPOOLS];
133 static void *next_yield[NPOOLS];
134 static int yield_length[NPOOLS];
135 static unsigned store_block_order[NPOOLS];
136
137 /* pool_malloc holds the amount of memory used by the store pools; this goes up
138 and down as store is reset or released. nonpool_malloc is the total got by
139 malloc from other calls; this doesn't go down because it is just freed by
140 pointer. */
141
142 static int pool_malloc;
143 static int nonpool_malloc;
144
145 /* This variable is set by store_get() to its yield, and by store_reset() to
146 NULL. This enables string_cat() to optimize its store handling for very long
147 strings. That's why the variable is global. */
148
149 void *store_last_get[NPOOLS];
150
151 /* These are purely for stats-gathering */
152
153 static int nbytes[NPOOLS];      /* current bytes allocated */
154 static int maxbytes[NPOOLS];    /* max number reached */
155 static int nblocks[NPOOLS];     /* current number of blocks allocated */
156 static int maxblocks[NPOOLS];
157 static unsigned maxorder[NPOOLS];
158 static int n_nonpool_blocks;    /* current number of direct store_malloc() blocks */
159 static int max_nonpool_blocks;
160 static int max_pool_malloc;     /* max value for pool_malloc */
161 static int max_nonpool_malloc;  /* max value for nonpool_malloc */
162
163
164 #ifndef COMPILE_UTILITY
165 static const uschar * pooluse[NPOOLS] = {
166 [POOL_MAIN] =           US"main",
167 [POOL_PERM] =           US"perm",
168 [POOL_SEARCH] =         US"search",
169 [POOL_MESSAGE] =        US"message",
170 [POOL_TAINT_MAIN] =     US"main",
171 [POOL_TAINT_PERM] =     US"perm",
172 [POOL_TAINT_SEARCH] =   US"search",
173 [POOL_TAINT_SEARCH] =   US"search",
174 [POOL_TAINT_MESSAGE] =  US"message",
175 };
176 static const uschar * poolclass[NPOOLS] = {
177 [POOL_MAIN] =           US"untainted",
178 [POOL_PERM] =           US"untainted",
179 [POOL_SEARCH] =         US"untainted",
180 [POOL_MESSAGE] =        US"untainted",
181 [POOL_TAINT_MAIN] =     US"tainted",
182 [POOL_TAINT_PERM] =     US"tainted",
183 [POOL_TAINT_SEARCH] =   US"tainted",
184 [POOL_TAINT_MESSAGE] =  US"tainted",
185 };
186 #endif
187
188
189 static void * internal_store_malloc(int, const char *, int);
190 static void   internal_store_free(void *, const char *, int linenumber);
191
192 /******************************************************************************/
193 /* Initialisation, for things fragile with parameter channges when using
194 static initialisers. */
195
196 void
197 store_init(void)
198 {
199 for (int i = 0; i < NPOOLS; i++)
200   {
201   yield_length[i] = -1;
202   store_block_order[i] = 12; /* log2(allocation_size) ie. 4kB */
203   }
204 }
205
206 /******************************************************************************/
207
208 /* Test if a pointer refers to tainted memory.
209
210 Slower version check, for use when platform intermixes malloc and mmap area
211 addresses. Test against the current-block of all tainted pools first, then all
212 blocks of all tainted pools.
213
214 Return: TRUE iff tainted
215 */
216
217 BOOL
218 is_tainted_fn(const void * p)
219 {
220 storeblock * b;
221
222 for (int pool = POOL_TAINT_BASE; pool < nelem(chainbase); pool++)
223   if ((b = current_block[pool]))
224     {
225     uschar * bc = US b + ALIGNED_SIZEOF_STOREBLOCK;
226     if (US p >= bc && US p < bc + b->length) return TRUE;
227     }
228
229 for (int pool = POOL_TAINT_BASE; pool < nelem(chainbase); pool++)
230   for (b = chainbase[pool]; b; b = b->next)
231     {
232     uschar * bc = US b + ALIGNED_SIZEOF_STOREBLOCK;
233     if (US p >= bc && US p < bc + b->length) return TRUE;
234     }
235 return FALSE;
236 }
237
238
239 void
240 die_tainted(const uschar * msg, const uschar * func, int line)
241 {
242 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Taint mismatch, %s: %s %d\n",
243         msg, func, line);
244 }
245
246
247
248 /*************************************************
249 *       Get a block from the current pool        *
250 *************************************************/
251
252 /* Running out of store is a total disaster. This function is called via the
253 macro store_get(). It passes back a block of store within the current big
254 block, getting a new one if necessary. The address is saved in
255 store_last_was_get.
256
257 Arguments:
258   size        amount wanted, bytes
259   tainted     class: set to true for untrusted data (eg. from smtp input)
260   func        function from which called
261   linenumber  line number in source file
262
263 Returns:      pointer to store (panic on malloc failure)
264 */
265
266 void *
267 store_get_3(int size, BOOL tainted, const char *func, int linenumber)
268 {
269 int pool = tainted ? store_pool + POOL_TAINT_BASE : store_pool;
270
271 /* Round up the size to a multiple of the alignment. Although this looks a
272 messy statement, because "alignment" is a constant expression, the compiler can
273 do a reasonable job of optimizing, especially if the value of "alignment" is a
274 power of two. I checked this with -O2, and gcc did very well, compiling it to 4
275 instructions on a Sparc (alignment = 8). */
276
277 if (size % alignment != 0) size += alignment - (size % alignment);
278
279 /* If there isn't room in the current block, get a new one. The minimum
280 size is STORE_BLOCK_SIZE, and we would expect this to be the norm, since
281 these functions are mostly called for small amounts of store. */
282
283 if (size > yield_length[pool])
284   {
285   int length = MAX(STORE_BLOCK_SIZE(store_block_order[pool]), size);
286   int mlength = length + ALIGNED_SIZEOF_STOREBLOCK;
287   storeblock * newblock;
288
289   /* Sometimes store_reset() may leave a block for us; check if we can use it */
290
291   if (  (newblock = current_block[pool])
292      && (newblock = newblock->next)
293      && newblock->length < length
294      )
295     {
296     /* Give up on this block, because it's too small */
297     nblocks[pool]--;
298     internal_store_free(newblock, func, linenumber);
299     newblock = NULL;
300     }
301
302   /* If there was no free block, get a new one */
303
304   if (!newblock)
305     {
306     if ((nbytes[pool] += mlength) > maxbytes[pool])
307       maxbytes[pool] = nbytes[pool];
308     if ((pool_malloc += mlength) > max_pool_malloc)     /* Used in pools */
309       max_pool_malloc = pool_malloc;
310     nonpool_malloc -= mlength;                  /* Exclude from overall total */
311     if (++nblocks[pool] > maxblocks[pool])
312       maxblocks[pool] = nblocks[pool];
313
314     newblock = internal_store_malloc(mlength, func, linenumber);
315     newblock->next = NULL;
316     newblock->length = length;
317 #ifndef RESTRICTED_MEMORY
318     if (store_block_order[pool]++ > maxorder[pool])
319       maxorder[pool] = store_block_order[pool];
320 #endif
321
322     if (!chainbase[pool])
323       chainbase[pool] = newblock;
324     else
325       current_block[pool]->next = newblock;
326     }
327
328   current_block[pool] = newblock;
329   yield_length[pool] = newblock->length;
330   next_yield[pool] =
331     (void *)(CS current_block[pool] + ALIGNED_SIZEOF_STOREBLOCK);
332   (void) VALGRIND_MAKE_MEM_NOACCESS(next_yield[pool], yield_length[pool]);
333   }
334
335 /* There's (now) enough room in the current block; the yield is the next
336 pointer. */
337
338 store_last_get[pool] = next_yield[pool];
339
340 /* Cut out the debugging stuff for utilities, but stop picky compilers from
341 giving warnings. */
342
343 #ifndef COMPILE_UTILITY
344 DEBUG(D_memory)
345   debug_printf("---%d Get %6p %5d %-14s %4d\n", pool,
346     store_last_get[pool], size, func, linenumber);
347 #endif  /* COMPILE_UTILITY */
348
349 (void) VALGRIND_MAKE_MEM_UNDEFINED(store_last_get[pool], size);
350 /* Update next pointer and number of bytes left in the current block. */
351
352 next_yield[pool] = (void *)(CS next_yield[pool] + size);
353 yield_length[pool] -= size;
354 return store_last_get[pool];
355 }
356
357
358
359 /*************************************************
360 *       Get a block from the PERM pool           *
361 *************************************************/
362
363 /* This is just a convenience function, useful when just a single block is to
364 be obtained.
365
366 Arguments:
367   size        amount wanted
368   func        function from which called
369   linenumber  line number in source file
370
371 Returns:      pointer to store (panic on malloc failure)
372 */
373
374 void *
375 store_get_perm_3(int size, BOOL tainted, const char *func, int linenumber)
376 {
377 void *yield;
378 int old_pool = store_pool;
379 store_pool = POOL_PERM;
380 yield = store_get_3(size, tainted, func, linenumber);
381 store_pool = old_pool;
382 return yield;
383 }
384
385
386
387 /*************************************************
388 *      Extend a block if it is at the top        *
389 *************************************************/
390
391 /* While reading strings of unknown length, it is often the case that the
392 string is being read into the block at the top of the stack. If it needs to be
393 extended, it is more efficient just to extend within the top block rather than
394 allocate a new block and then have to copy the data. This function is provided
395 for the use of string_cat(), but of course can be used elsewhere too.
396 The block itself is not expanded; only the top allocation from it.
397
398 Arguments:
399   ptr        pointer to store block
400   oldsize    current size of the block, as requested by user
401   newsize    new size required
402   func       function from which called
403   linenumber line number in source file
404
405 Returns:     TRUE if the block is at the top of the stack and has been
406              extended; FALSE if it isn't at the top of the stack, or cannot
407              be extended
408 */
409
410 BOOL
411 store_extend_3(void *ptr, BOOL tainted, int oldsize, int newsize,
412    const char *func, int linenumber)
413 {
414 int pool = tainted ? store_pool + POOL_TAINT_BASE : store_pool;
415 int inc = newsize - oldsize;
416 int rounded_oldsize = oldsize;
417
418 /* Check that the block being extended was already of the required taint status;
419 refuse to extend if not. */
420
421 if (is_tainted(ptr) != tainted)
422   return FALSE;
423
424 if (rounded_oldsize % alignment != 0)
425   rounded_oldsize += alignment - (rounded_oldsize % alignment);
426
427 if (CS ptr + rounded_oldsize != CS (next_yield[pool]) ||
428     inc > yield_length[pool] + rounded_oldsize - oldsize)
429   return FALSE;
430
431 /* Cut out the debugging stuff for utilities, but stop picky compilers from
432 giving warnings. */
433
434 #ifndef COMPILE_UTILITY
435 DEBUG(D_memory)
436   debug_printf("---%d Ext %6p %5d %-14s %4d\n", pool, ptr, newsize,
437     func, linenumber);
438 #endif  /* COMPILE_UTILITY */
439
440 if (newsize % alignment != 0) newsize += alignment - (newsize % alignment);
441 next_yield[pool] = CS ptr + newsize;
442 yield_length[pool] -= newsize - rounded_oldsize;
443 (void) VALGRIND_MAKE_MEM_UNDEFINED(ptr + oldsize, inc);
444 return TRUE;
445 }
446
447
448
449
450 static BOOL
451 is_pwr2_size(int len)
452 {
453 unsigned x = len;
454 return (x & (x - 1)) == 0;
455 }
456
457
458 /*************************************************
459 *    Back up to a previous point on the stack    *
460 *************************************************/
461
462 /* This function resets the next pointer, freeing any subsequent whole blocks
463 that are now unused. Call with a cookie obtained from store_mark() only; do
464 not call with a pointer returned by store_get().  Both the untainted and tainted
465 pools corresposding to store_pool are reset.
466
467 Arguments:
468   r           place to back up to
469   func        function from which called
470   linenumber  line number in source file
471
472 Returns:      nothing
473 */
474
475 static void
476 internal_store_reset(void * ptr, int pool, const char *func, int linenumber)
477 {
478 storeblock * bb;
479 storeblock * b = current_block[pool];
480 char * bc = CS b + ALIGNED_SIZEOF_STOREBLOCK;
481 int newlength, count;
482 #ifndef COMPILE_UTILITY
483 int oldmalloc = pool_malloc;
484 #endif
485
486 /* Last store operation was not a get */
487
488 store_last_get[pool] = NULL;
489
490 /* See if the place is in the current block - as it often will be. Otherwise,
491 search for the block in which it lies. */
492
493 if (CS ptr < bc || CS ptr > bc + b->length)
494   {
495   for (b = chainbase[pool]; b; b = b->next)
496     {
497     bc = CS b + ALIGNED_SIZEOF_STOREBLOCK;
498     if (CS ptr >= bc && CS ptr <= bc + b->length) break;
499     }
500   if (!b)
501     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "internal error: store_reset(%p) "
502       "failed: pool=%d %-14s %4d", ptr, pool, func, linenumber);
503   }
504
505 /* Back up, rounding to the alignment if necessary. When testing, flatten
506 the released memory. */
507
508 newlength = bc + b->length - CS ptr;
509 #ifndef COMPILE_UTILITY
510 if (debug_store)
511   {
512   assert_no_variables(ptr, newlength, func, linenumber);
513   if (f.running_in_test_harness)
514     {
515     (void) VALGRIND_MAKE_MEM_DEFINED(ptr, newlength);
516     memset(ptr, 0xF0, newlength);
517     }
518   }
519 #endif
520 (void) VALGRIND_MAKE_MEM_NOACCESS(ptr, newlength);
521 next_yield[pool] = CS ptr + (newlength % alignment);
522 count = yield_length[pool];
523 count = (yield_length[pool] = newlength - (newlength % alignment)) - count;
524 current_block[pool] = b;
525
526 /* Free any subsequent block. Do NOT free the first
527 successor, if our current block has less than 256 bytes left. This should
528 prevent us from flapping memory. However, keep this block only when it has
529 a power-of-two size so probably is not a custom inflated one. */
530
531 if (  yield_length[pool] < STOREPOOL_MIN_SIZE
532    && b->next
533    && is_pwr2_size(b->next->length + ALIGNED_SIZEOF_STOREBLOCK))
534   {
535   b = b->next;
536 #ifndef COMPILE_UTILITY
537   if (debug_store)
538     assert_no_variables(b, b->length + ALIGNED_SIZEOF_STOREBLOCK,
539                         func, linenumber);
540 #endif
541   (void) VALGRIND_MAKE_MEM_NOACCESS(CS b + ALIGNED_SIZEOF_STOREBLOCK,
542                 b->length - ALIGNED_SIZEOF_STOREBLOCK);
543   }
544
545 bb = b->next;
546 b->next = NULL;
547
548 /* If there will be only one block left in the pool, drop one
549 most-recent allocation size increase, ensuring it does not increase
550 forever. */
551
552 if (!bb && store_block_order[pool] > 12) store_block_order[pool]--;
553
554 while ((b = bb))
555   {
556   int siz = b->length + ALIGNED_SIZEOF_STOREBLOCK;
557 #ifndef COMPILE_UTILITY
558   if (debug_store)
559     assert_no_variables(b, b->length + ALIGNED_SIZEOF_STOREBLOCK,
560                         func, linenumber);
561 #endif
562   bb = bb->next;
563   nbytes[pool] -= siz;
564   pool_malloc -= siz;
565   nblocks[pool]--;
566   internal_store_free(b, func, linenumber);
567   }
568
569 /* Cut out the debugging stuff for utilities, but stop picky compilers from
570 giving warnings. */
571
572 #ifndef COMPILE_UTILITY
573 DEBUG(D_memory)
574   debug_printf("---%d Rst %6p %5d %-14s %4d\tpool %d\n", pool, ptr,
575     count + oldmalloc - pool_malloc,
576     func, linenumber, pool_malloc);
577 #endif  /* COMPILE_UTILITY */
578 }
579
580
581 rmark
582 store_reset_3(rmark r, const char *func, int linenumber)
583 {
584 void ** ptr = r;
585
586 if (store_pool >= POOL_TAINT_BASE)
587   log_write(0, LOG_MAIN|LOG_PANIC_DIE,
588     "store_reset called for pool %d: %s %d\n", store_pool, func, linenumber);
589 if (!r)
590   log_write(0, LOG_MAIN|LOG_PANIC_DIE,
591     "store_reset called with bad mark: %s %d\n", func, linenumber);
592
593 internal_store_reset(*ptr, store_pool + POOL_TAINT_BASE, func, linenumber);
594 internal_store_reset(ptr,  store_pool,             func, linenumber);
595 return NULL;
596 }
597
598
599
600 /* Free tail-end unused allocation.  This lets us allocate a big chunk
601 early, for cases when we only discover later how much was really needed.
602
603 Can be called with a value from store_get(), or an offset after such.  Only
604 the tainted or untainted pool that serviced the store_get() will be affected.
605
606 This is mostly a cut-down version of internal_store_reset().
607 XXX needs rationalising
608 */
609
610 void
611 store_release_above_3(void *ptr, const char *func, int linenumber)
612 {
613 /* Search all pools' "current" blocks.  If it isn't one of those,
614 ignore it (it usually will be). */
615
616 for (int pool = 0; pool < nelem(current_block); pool++)
617   {
618   storeblock * b = current_block[pool];
619   char * bc;
620   int count, newlength;
621
622   if (!b)
623     continue;
624
625   bc = CS b + ALIGNED_SIZEOF_STOREBLOCK;
626   if (CS ptr < bc || CS ptr > bc + b->length)
627     continue;
628
629   /* Last store operation was not a get */
630
631   store_last_get[pool] = NULL;
632
633   /* Back up, rounding to the alignment if necessary. When testing, flatten
634   the released memory. */
635
636   newlength = bc + b->length - CS ptr;
637 #ifndef COMPILE_UTILITY
638   if (debug_store)
639     {
640     assert_no_variables(ptr, newlength, func, linenumber);
641     if (f.running_in_test_harness)
642       {
643       (void) VALGRIND_MAKE_MEM_DEFINED(ptr, newlength);
644       memset(ptr, 0xF0, newlength);
645       }
646     }
647 #endif
648   (void) VALGRIND_MAKE_MEM_NOACCESS(ptr, newlength);
649   next_yield[pool] = CS ptr + (newlength % alignment);
650   count = yield_length[pool];
651   count = (yield_length[pool] = newlength - (newlength % alignment)) - count;
652
653   /* Cut out the debugging stuff for utilities, but stop picky compilers from
654   giving warnings. */
655
656 #ifndef COMPILE_UTILITY
657   DEBUG(D_memory)
658     debug_printf("---%d Rel %6p %5d %-14s %4d\tpool %d\n", pool, ptr, count,
659       func, linenumber, pool_malloc);
660 #endif
661   return;
662   }
663 #ifndef COMPILE_UTILITY
664 DEBUG(D_memory)
665   debug_printf("non-last memory release try: %s %d\n", func, linenumber);
666 #endif
667 }
668
669
670
671 rmark
672 store_mark_3(const char *func, int linenumber)
673 {
674 void ** p;
675
676 #ifndef COMPILE_UTILITY
677 DEBUG(D_memory)
678   debug_printf("---%d Mrk                    %-14s %4d\tpool %d\n",
679     store_pool, func, linenumber, pool_malloc);
680 #endif  /* COMPILE_UTILITY */
681
682 if (store_pool >= POOL_TAINT_BASE)
683   log_write(0, LOG_MAIN|LOG_PANIC_DIE,
684     "store_mark called for pool %d: %s %d\n", store_pool, func, linenumber);
685
686 /* Stash a mark for the tainted-twin release, in the untainted twin. Return
687 a cookie (actually the address in the untainted pool) to the caller.
688 Reset uses the cookie to recover the t-mark, winds back the tainted pool with it
689 and winds back the untainted pool with the cookie. */
690
691 p = store_get_3(sizeof(void *), FALSE, func, linenumber);
692 *p = store_get_3(0, TRUE, func, linenumber);
693 return p;
694 }
695
696
697
698
699 /************************************************
700 *             Release store                     *
701 ************************************************/
702
703 /* This function checks that the pointer it is given is the first thing in a
704 block, and if so, releases that block.
705
706 Arguments:
707   block       block of store to consider
708   func        function from which called
709   linenumber  line number in source file
710
711 Returns:      nothing
712 */
713
714 static void
715 store_release_3(void * block, int pool, const char * func, int linenumber)
716 {
717 /* It will never be the first block, so no need to check that. */
718
719 for (storeblock * b = chainbase[pool]; b; b = b->next)
720   {
721   storeblock * bb = b->next;
722   if (bb && CS block == CS bb + ALIGNED_SIZEOF_STOREBLOCK)
723     {
724     int siz = bb->length + ALIGNED_SIZEOF_STOREBLOCK;
725     b->next = bb->next;
726     nbytes[pool] -= siz;
727     pool_malloc -= siz;
728     nblocks[pool]--;
729
730     /* Cut out the debugging stuff for utilities, but stop picky compilers
731     from giving warnings. */
732
733 #ifndef COMPILE_UTILITY
734     DEBUG(D_memory)
735       debug_printf("-Release %6p %-20s %4d %d\n", (void *)bb, func,
736         linenumber, pool_malloc);
737
738     if (f.running_in_test_harness)
739       memset(bb, 0xF0, bb->length+ALIGNED_SIZEOF_STOREBLOCK);
740 #endif  /* COMPILE_UTILITY */
741
742     free(bb);
743     return;
744     }
745   }
746 }
747
748
749 /************************************************
750 *             Move store                        *
751 ************************************************/
752
753 /* Allocate a new block big enough to expend to the given size and
754 copy the current data into it.  Free the old one if possible.
755
756 This function is specifically provided for use when reading very
757 long strings, e.g. header lines. When the string gets longer than a
758 complete block, it gets copied to a new block. It is helpful to free
759 the old block iff the previous copy of the string is at its start,
760 and therefore the only thing in it. Otherwise, for very long strings,
761 dead store can pile up somewhat disastrously. This function checks that
762 the pointer it is given is the first thing in a block, and that nothing
763 has been allocated since. If so, releases that block.
764
765 Arguments:
766   block
767   newsize
768   len
769
770 Returns:        new location of data
771 */
772
773 void *
774 store_newblock_3(void * block, BOOL tainted, int newsize, int len,
775   const char * func, int linenumber)
776 {
777 int pool = tainted ? store_pool + POOL_TAINT_BASE : store_pool;
778 BOOL release_ok = !tainted && store_last_get[pool] == block;
779 uschar * newtext;
780
781 #if !defined(MACRO_PREDEF) && !defined(COMPILE_UTILITY)
782 if (is_tainted(block) != tainted)
783   die_tainted(US"store_newblock", CUS func, linenumber);
784 #endif
785
786 newtext = store_get(newsize, tainted);
787 memcpy(newtext, block, len);
788 if (release_ok) store_release_3(block, pool, func, linenumber);
789 return (void *)newtext;
790 }
791
792
793
794
795 /*************************************************
796 *                Malloc store                    *
797 *************************************************/
798
799 /* Running out of store is a total disaster for exim. Some malloc functions
800 do not run happily on very small sizes, nor do they document this fact. This
801 function is called via the macro store_malloc().
802
803 Arguments:
804   size        amount of store wanted
805   func        function from which called
806   line        line number in source file
807
808 Returns:      pointer to gotten store (panic on failure)
809 */
810
811 static void *
812 internal_store_malloc(int size, const char *func, int line)
813 {
814 void * yield;
815
816 size += sizeof(int);    /* space to store the size, used under debug */
817 if (size < 16) size = 16;
818
819 if (!(yield = malloc((size_t)size)))
820   log_write(0, LOG_MAIN|LOG_PANIC_DIE, "failed to malloc %d bytes of memory: "
821     "called from line %d in %s", size, line, func);
822
823 #ifndef COMPILE_UTILITY
824 DEBUG(D_any) *(int *)yield = size;
825 #endif
826 yield = US yield + sizeof(int);
827
828 if ((nonpool_malloc += size) > max_nonpool_malloc)
829   max_nonpool_malloc = nonpool_malloc;
830
831 /* Cut out the debugging stuff for utilities, but stop picky compilers from
832 giving warnings. */
833
834 #ifndef COMPILE_UTILITY
835 /* If running in test harness, spend time making sure all the new store
836 is not filled with zeros so as to catch problems. */
837
838 if (f.running_in_test_harness)
839   memset(yield, 0xF0, (size_t)size - sizeof(int));
840 DEBUG(D_memory) debug_printf("--Malloc %6p %5d bytes\t%-20s %4d\tpool %5d  nonpool %5d\n",
841   yield, size, func, line, pool_malloc, nonpool_malloc);
842 #endif  /* COMPILE_UTILITY */
843
844 return yield;
845 }
846
847 void *
848 store_malloc_3(int size, const char *func, int linenumber)
849 {
850 if (n_nonpool_blocks++ > max_nonpool_blocks)
851   max_nonpool_blocks = n_nonpool_blocks;
852 return internal_store_malloc(size, func, linenumber);
853 }
854
855
856 /************************************************
857 *             Free store                        *
858 ************************************************/
859
860 /* This function is called by the macro store_free().
861
862 Arguments:
863   block       block of store to free
864   func        function from which called
865   linenumber  line number in source file
866
867 Returns:      nothing
868 */
869
870 static void
871 internal_store_free(void * block, const char * func, int linenumber)
872 {
873 uschar * p = US block - sizeof(int);
874 #ifndef COMPILE_UTILITY
875 DEBUG(D_any) nonpool_malloc -= *(int *)p;
876 DEBUG(D_memory) debug_printf("----Free %6p %5d bytes\t%-20s %4d\n", block, *(int *)p, func, linenumber);
877 #endif
878 free(p);
879 }
880
881 void
882 store_free_3(void * block, const char * func, int linenumber)
883 {
884 n_nonpool_blocks--;
885 internal_store_free(block, func, linenumber);
886 }
887
888 /******************************************************************************/
889 /* Stats output on process exit */
890 void
891 store_exit(void)
892 {
893 #ifndef COMPILE_UTILITY
894 DEBUG(D_memory)
895  {
896  debug_printf("----Exit nonpool max: %3d kB in %d blocks\n",
897   (max_nonpool_malloc+1023)/1024, max_nonpool_blocks);
898  debug_printf("----Exit npools  max: %3d kB\n", max_pool_malloc/1024);
899  for (int i = 0; i < NPOOLS; i++)
900   debug_printf("----Exit  pool %d max: %3d kB in %d blocks at order %u\t%s %s\n",
901     i, maxbytes[i]/1024, maxblocks[i], maxorder[i],
902     poolclass[i], pooluse[i]);
903  }
904 #endif
905 }
906
907
908 /******************************************************************************/
909 /* Per-message pool management */
910
911 static rmark   message_reset_point    = NULL;
912
913 void
914 message_start(void)
915 {
916 int oldpool = store_pool;
917 store_pool = POOL_MESSAGE;
918 if (!message_reset_point) message_reset_point = store_mark();
919 store_pool = oldpool;
920 }
921
922 void message_tidyup(void)
923 {
924 int oldpool;
925 if (!message_reset_point) return;
926 oldpool = store_pool;
927 store_pool = POOL_MESSAGE;
928 message_reset_point = store_reset(message_reset_point);
929 store_pool = oldpool;
930 }
931
932 /* End of store.c */