From: John Paul Adrian Glaubitz Date: Sun, 28 Nov 2021 17:26:40 +0000 (+0000) Subject: Fix basic memory use for SPARC. Bug 2838 X-Git-Tag: exim-4.96-RC0~121 X-Git-Url: https://git.exim.org/exim.git/commitdiff_plain/d73b9f478a2a5b299634acee4e05ff8ea25375a2 Fix basic memory use for SPARC. Bug 2838 --- diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog index 1d4b3c1c5..e40c11a1d 100644 --- a/doc/doc-txt/ChangeLog +++ b/doc/doc-txt/ChangeLog @@ -53,6 +53,11 @@ JH/11 Fix use of $sender_host_name in daemon process. When used in certain connection was never replaced for subsequent connections. Found by Wakko Warner. +JH/12 Bug 2838: Fix for i32lp64 hard-align platforms. Found for SPARC Linux, + though only once PCRE2 was introduced: the memory accounting used under + debug offset allocations by an int, giving a hard trap in early startup. + Change to using a size_t. Debug and fix by John Paul Adrian Glaubitz. + Exim version 4.95 ----------------- diff --git a/src/src/store.c b/src/src/store.c index e4cd722c3..c2e3f17bf 100644 --- a/src/src/store.c +++ b/src/src/store.c @@ -192,7 +192,7 @@ static const uschar * poolclass[NPOOLS] = { #endif -static void * internal_store_malloc(int, const char *, int); +static void * internal_store_malloc(size_t, const char *, int); static void internal_store_free(void *, const char *, int linenumber); /******************************************************************************/ @@ -867,26 +867,29 @@ Returns: pointer to gotten store (panic on failure) */ static void * -internal_store_malloc(int size, const char *func, int line) +internal_store_malloc(size_t size, const char *func, int line) { void * yield; -if (size < 0 || size >= INT_MAX/2) +/* Check specifically for a possibly result of conversion from +a negative int, to the (unsigned, wider) size_t */ + +if (size >= INT_MAX/2) log_write(0, LOG_MAIN|LOG_PANIC_DIE, - "bad memory allocation requested (%d bytes) at %s %d", - size, func, line); + "bad memory allocation requested (%lld bytes) at %s %d", + (unsigned long long)size, func, line); -size += sizeof(int); /* space to store the size, used under debug */ +size += sizeof(size_t); /* space to store the size, used under debug */ if (size < 16) size = 16; -if (!(yield = malloc((size_t)size))) +if (!(yield = malloc(size))) log_write(0, LOG_MAIN|LOG_PANIC_DIE, "failed to malloc %d bytes of memory: " "called from line %d in %s", size, line, func); #ifndef COMPILE_UTILITY -DEBUG(D_any) *(int *)yield = size; +DEBUG(D_any) *(size_t *)yield = size; #endif -yield = US yield + sizeof(int); +yield = US yield + sizeof(size_t); if ((nonpool_malloc += size) > max_nonpool_malloc) max_nonpool_malloc = nonpool_malloc; @@ -899,8 +902,8 @@ giving warnings. */ is not filled with zeros so as to catch problems. */ if (f.running_in_test_harness) - memset(yield, 0xF0, (size_t)size - sizeof(int)); -DEBUG(D_memory) debug_printf("--Malloc %6p %5d bytes\t%-20s %4d\tpool %5d nonpool %5d\n", + memset(yield, 0xF0, size - sizeof(size_t)); +DEBUG(D_memory) debug_printf("--Malloc %6p %5lld bytes\t%-20s %4d\tpool %5d nonpool %5d\n", yield, size, func, line, pool_malloc, nonpool_malloc); #endif /* COMPILE_UTILITY */ @@ -908,7 +911,7 @@ return yield; } void * -store_malloc_3(int size, const char *func, int linenumber) +store_malloc_3(size_t size, const char *func, int linenumber) { if (n_nonpool_blocks++ > max_nonpool_blocks) max_nonpool_blocks = n_nonpool_blocks; @@ -933,10 +936,11 @@ Returns: nothing static void internal_store_free(void * block, const char * func, int linenumber) { -uschar * p = US block - sizeof(int); +uschar * p = US block - sizeof(size_t); #ifndef COMPILE_UTILITY -DEBUG(D_any) nonpool_malloc -= *(int *)p; -DEBUG(D_memory) debug_printf("----Free %6p %5d bytes\t%-20s %4d\n", block, *(int *)p, func, linenumber); +DEBUG(D_any) nonpool_malloc -= *(size_t *)p; +DEBUG(D_memory) debug_printf("----Free %6p %5lld bytes\t%-20s %4d\n", + block, (unsigned long long) *(size_t *)p, func, linenumber); #endif free(p); } diff --git a/src/src/store.h b/src/src/store.h index ccfa8f012..3e4240842 100644 --- a/src/src/store.h +++ b/src/src/store.h @@ -65,7 +65,7 @@ typedef void ** rmark; extern BOOL store_extend_3(void *, BOOL, int, int, const char *, int); extern void store_free_3(void *, const char *, int); /* store_get_3 & store_get_perm_3 are in local_scan.h */ -extern void *store_malloc_3(int, const char *, int) ALLOC ALLOC_SIZE(1) WARN_UNUSED_RESULT; +extern void *store_malloc_3(size_t, const char *, int) ALLOC ALLOC_SIZE(1) WARN_UNUSED_RESULT; extern rmark store_mark_3(const char *, int); extern void *store_newblock_3(void *, BOOL, int, int, const char *, int); extern void store_release_above_3(void *, const char *, int);