git://git.exim.org
/
exim.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix continue_more on TLS connection. Bug 2104
[exim.git]
/
src
/
src
/
store.c
diff --git
a/src/src/store.c
b/src/src/store.c
index 52fabe7566a6e3d3cf8f664ae14754f3952e1af0..8628954b5b2eec784aea7ddbb2456e04b8e3ca87 100644
(file)
--- a/
src/src/store.c
+++ b/
src/src/store.c
@@
-1,10
+1,8
@@
-/* $Cambridge: exim/src/src/store.c,v 1.2 2005/01/04 10:00:42 ph10 Exp $ */
-
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) University of Cambridge 1995 - 20
05
*/
+/* Copyright (c) University of Cambridge 1995 - 20
16
*/
/* See the file NOTICE for conditions of use and distribution. */
/* Exim gets and frees all its store through these functions. In the original
/* See the file NOTICE for conditions of use and distribution. */
/* Exim gets and frees all its store through these functions. In the original
@@
-41,6
+39,10
@@
The following different types of store are recognized:
#include "exim.h"
#include "exim.h"
+/* keep config.h before memcheck.h, for NVALGRIND */
+#include "config.h"
+
+#include "memcheck.h"
/* We need to know how to align blocks of data for general use. I'm not sure
/* We need to know how to align blocks of data for general use. I'm not sure
@@
-142,39
+144,40
@@
if (size > yield_length[store_pool])
{
int length = (size <= STORE_BLOCK_SIZE)? STORE_BLOCK_SIZE : size;
int mlength = length + ALIGNED_SIZEOF_STOREBLOCK;
{
int length = (size <= STORE_BLOCK_SIZE)? STORE_BLOCK_SIZE : size;
int mlength = length + ALIGNED_SIZEOF_STOREBLOCK;
- storeblock *newblock = NULL;
+ storeblock *
newblock = NULL;
/* Sometimes store_reset() may leave a block for us; check if we can use it */
/* Sometimes store_reset() may leave a block for us; check if we can use it */
- if (current_block[store_pool] != NULL &&
- current_block[store_pool]->next != NULL)
+ if ( (newblock = current_block[store_pool])
+ && (newblock = newblock->next)
+ && newblock->length < length
+ )
{
{
- newblock = current_block[store_pool]->next;
- if (newblock->length < length)
- {
- /* Give up on this block, because it's too small */
- store_free(newblock);
- newblock = NULL;
- }
+ /* Give up on this block, because it's too small */
+ store_free(newblock);
+ newblock = NULL;
}
/* If there was no free block, get a new one */
}
/* If there was no free block, get a new one */
- if (
newblock == NULL
)
+ if (
!newblock
)
{
pool_malloc += mlength; /* Used in pools */
nonpool_malloc -= mlength; /* Exclude from overall total */
newblock = store_malloc(mlength);
newblock->next = NULL;
newblock->length = length;
{
pool_malloc += mlength; /* Used in pools */
nonpool_malloc -= mlength; /* Exclude from overall total */
newblock = store_malloc(mlength);
newblock->next = NULL;
newblock->length = length;
- if (chainbase[store_pool] == NULL) chainbase[store_pool] = newblock;
- else current_block[store_pool]->next = newblock;
+ if (!chainbase[store_pool])
+ chainbase[store_pool] = newblock;
+ else
+ current_block[store_pool]->next = newblock;
}
current_block[store_pool] = newblock;
yield_length[store_pool] = newblock->length;
next_yield[store_pool] =
}
current_block[store_pool] = newblock;
yield_length[store_pool] = newblock->length;
next_yield[store_pool] =
- (void *)((char *)current_block[store_pool] + ALIGNED_SIZEOF_STOREBLOCK);
+ (void *)(CS current_block[store_pool] + ALIGNED_SIZEOF_STOREBLOCK);
+ (void) VALGRIND_MAKE_MEM_NOACCESS(next_yield[store_pool], yield_length[store_pool]);
}
/* There's (now) enough room in the current block; the yield is the next
}
/* There's (now) enough room in the current block; the yield is the next
@@
-199,6
+202,7
@@
DEBUG(D_memory)
}
#endif /* COMPILE_UTILITY */
}
#endif /* COMPILE_UTILITY */
+(void) VALGRIND_MAKE_MEM_UNDEFINED(store_last_get[store_pool], size);
/* Update next pointer and number of bytes left in the current block. */
next_yield[store_pool] = (void *)((char *)next_yield[store_pool] + size);
/* Update next pointer and number of bytes left in the current block. */
next_yield[store_pool] = (void *)((char *)next_yield[store_pool] + size);
@@
-293,6
+297,7
@@
DEBUG(D_memory)
if (newsize % alignment != 0) newsize += alignment - (newsize % alignment);
next_yield[store_pool] = (char *)ptr + newsize;
yield_length[store_pool] -= newsize - rounded_oldsize;
if (newsize % alignment != 0) newsize += alignment - (newsize % alignment);
next_yield[store_pool] = (char *)ptr + newsize;
yield_length[store_pool] -= newsize - rounded_oldsize;
+(void) VALGRIND_MAKE_MEM_UNDEFINED(ptr + oldsize, inc);
return TRUE;
}
return TRUE;
}
@@
-320,9
+325,9
@@
Returns: nothing
void
store_reset_3(void *ptr, const char *filename, int linenumber)
{
void
store_reset_3(void *ptr, const char *filename, int linenumber)
{
-storeblock *bb;
-storeblock *b = current_block[store_pool];
-char *
bc = (char *)
b + ALIGNED_SIZEOF_STOREBLOCK;
+storeblock *
bb;
+storeblock *
b = current_block[store_pool];
+char *
bc = CS
b + ALIGNED_SIZEOF_STOREBLOCK;
int newlength;
/* Last store operation was not a get */
int newlength;
/* Last store operation was not a get */
@@
-332,27
+337,36
@@
store_last_get[store_pool] = NULL;
/* See if the place is in the current block - as it often will be. Otherwise,
search for the block in which it lies. */
/* See if the place is in the current block - as it often will be. Otherwise,
search for the block in which it lies. */
-if (
(char *)ptr < bc || (char *)
ptr > bc + b->length)
+if (
CS ptr < bc || CS
ptr > bc + b->length)
{
{
- for (b = chainbase[store_pool]; b
!= NULL
; b = b->next)
+ for (b = chainbase[store_pool]; b; b = b->next)
{
{
- bc =
(char *)
b + ALIGNED_SIZEOF_STOREBLOCK;
- if (
(char *)ptr >= bc && (char *)
ptr <= bc + b->length) break;
+ bc =
CS
b + ALIGNED_SIZEOF_STOREBLOCK;
+ if (
CS ptr >= bc && CS
ptr <= bc + b->length) break;
}
}
- if (
b == NULL
)
- log_write(0, LOG_MAIN|LOG_PANIC_DIE, "internal error: store_reset(%
d
) "
+ if (
!b
)
+ log_write(0, LOG_MAIN|LOG_PANIC_DIE, "internal error: store_reset(%
p
) "
"failed: pool=%d %-14s %4d", ptr, store_pool, filename, linenumber);
}
/* Back up, rounding to the alignment if necessary. When testing, flatten
the released memory. */
"failed: pool=%d %-14s %4d", ptr, store_pool, filename, linenumber);
}
/* Back up, rounding to the alignment if necessary. When testing, flatten
the released memory. */
-newlength = bc + b->length -
(char *)
ptr;
+newlength = bc + b->length -
CS
ptr;
#ifndef COMPILE_UTILITY
#ifndef COMPILE_UTILITY
-if (running_in_test_harness) memset(ptr, 0xF0, newlength);
+if (running_in_test_harness || debug_store)
+ {
+ assert_no_variables(ptr, newlength, filename, linenumber);
+ if (running_in_test_harness)
+ {
+ (void) VALGRIND_MAKE_MEM_DEFINED(ptr, newlength);
+ memset(ptr, 0xF0, newlength);
+ }
+ }
#endif
#endif
+(void) VALGRIND_MAKE_MEM_NOACCESS(ptr, newlength);
yield_length[store_pool] = newlength - (newlength % alignment);
yield_length[store_pool] = newlength - (newlength % alignment);
-next_yield[store_pool] =
(char *)
ptr + (newlength % alignment);
+next_yield[store_pool] =
CS
ptr + (newlength % alignment);
current_block[store_pool] = b;
/* Free any subsequent block. Do NOT free the first successor, if our
current_block[store_pool] = b;
/* Free any subsequent block. Do NOT free the first successor, if our
@@
-360,16
+374,29
@@
current block has less than 256 bytes left. This should prevent us from
flapping memory. However, keep this block only when it has the default size. */
if (yield_length[store_pool] < STOREPOOL_MIN_SIZE &&
flapping memory. However, keep this block only when it has the default size. */
if (yield_length[store_pool] < STOREPOOL_MIN_SIZE &&
- b->next
!= NULL
&&
+ b->next &&
b->next->length == STORE_BLOCK_SIZE)
b->next->length == STORE_BLOCK_SIZE)
+ {
b = b->next;
b = b->next;
+#ifndef COMPILE_UTILITY
+ if (running_in_test_harness || debug_store)
+ assert_no_variables(b, b->length + ALIGNED_SIZEOF_STOREBLOCK,
+ filename, linenumber);
+#endif
+ (void) VALGRIND_MAKE_MEM_NOACCESS(CS b + ALIGNED_SIZEOF_STOREBLOCK,
+ b->length - ALIGNED_SIZEOF_STOREBLOCK);
+ }
bb = b->next;
b->next = NULL;
bb = b->next;
b->next = NULL;
-while (
bb != NULL
)
+while (
(b = bb)
)
{
{
- b = bb;
+#ifndef COMPILE_UTILITY
+ if (running_in_test_harness || debug_store)
+ assert_no_variables(b, b->length + ALIGNED_SIZEOF_STOREBLOCK,
+ filename, linenumber);
+#endif
bb = bb->next;
pool_malloc -= b->length + ALIGNED_SIZEOF_STOREBLOCK;
store_free_3(b, filename, linenumber);
bb = bb->next;
pool_malloc -= b->length + ALIGNED_SIZEOF_STOREBLOCK;
store_free_3(b, filename, linenumber);
@@
-483,9
+510,8
@@
store_malloc_3(int size, const char *filename, int linenumber)
void *yield;
if (size < 16) size = 16;
void *yield;
if (size < 16) size = 16;
-yield = malloc((size_t)size);
-if (
yield == NULL
)
+if (
!(yield = malloc((size_t)size))
)
log_write(0, LOG_MAIN|LOG_PANIC_DIE, "failed to malloc %d bytes of memory: "
"called from line %d of %s", size, linenumber, filename);
log_write(0, LOG_MAIN|LOG_PANIC_DIE, "failed to malloc %d bytes of memory: "
"called from line %d of %s", size, linenumber, filename);