X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsrc%2Fstore.c;h=2a32e9b5c40caa50cf7743ce8328ab29d918ff84;hb=7a33a3fc2c1ae4df30eaabaf25fc59e2d6ab5d6c;hp=c664ad9f42060dd95cb4baa5f8a8fc00f5b100d6;hpb=410b935d8ed35762b76b0edfa7a9fb9ba6500ebd;p=user%2Fhenk%2Fcode%2Fexim.git diff --git a/src/src/store.c b/src/src/store.c index c664ad9f4..2a32e9b5c 100644 --- a/src/src/store.c +++ b/src/src/store.c @@ -270,14 +270,14 @@ int pool = tainted ? store_pool + POOL_TAINT_BASE : store_pool; /* Ensure we've been asked to allocate memory. A negative size is a sign of a security problem. -A zero size is also suspect (but we might have to allow it if we find our API -expects it in some places). */ -if (size < 1) - { +A zero size might be also suspect, but our internal usage deliberately +does this to return a current watermark value for a later release of +allocated store. */ + +if (size < 0 || size >= INT_MAX/2) log_write(0, LOG_MAIN|LOG_PANIC_DIE, "bad memory allocation requested (%d bytes) at %s %d", size, func, linenumber); - } /* Round up the size to a multiple of the alignment. Although this looks a messy statement, because "alignment" is a constant expression, the compiler can @@ -428,12 +428,10 @@ int pool = tainted ? store_pool + POOL_TAINT_BASE : store_pool; int inc = newsize - oldsize; int rounded_oldsize = oldsize; -if (newsize < 0) - { +if (oldsize < 0 || newsize < oldsize || newsize >= INT_MAX/2) log_write(0, LOG_MAIN|LOG_PANIC_DIE, "bad memory extension requested (%d -> %d bytes) at %s %d", oldsize, newsize, func, linenumber); - } /* Check that the block being extended was already of the required taint status; refuse to extend if not. */ @@ -802,6 +800,11 @@ if (is_tainted(block) != tainted) die_tainted(US"store_newblock", CUS func, linenumber); #endif +if (len < 0 || len > newsize) + log_write(0, LOG_MAIN|LOG_PANIC_DIE, + "bad memory extension requested (%d -> %d bytes) at %s %d", + len, newsize, func, linenumber); + newtext = store_get(newsize, tainted); memcpy(newtext, block, len); if (release_ok) store_release_3(block, pool, func, linenumber); @@ -832,6 +835,11 @@ internal_store_malloc(int size, const char *func, int line) { void * yield; +if (size < 0 || size >= INT_MAX/2) + log_write(0, LOG_MAIN|LOG_PANIC_DIE, + "bad memory allocation requested (%d bytes) at %s %d", + size, func, line); + size += sizeof(int); /* space to store the size, used under debug */ if (size < 16) size = 16;