summaryrefslogtreecommitdiff
path: root/src/common/memarea.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2016-05-25 09:27:47 -0400
committerNick Mathewson <nickm@torproject.org>2016-05-25 09:27:47 -0400
commita3ec811c2ee801bf6dd3d7f65c4997470e807c9d (patch)
tree9b53d8af9639cb7ba9a012e9ffc9872ae17d0c7f /src/common/memarea.c
parent0ef36626ea0b3735d06360fde27100d33f2f5462 (diff)
parentfdfc528f85c11a1d29b6a67e32180278d1ca7cbb (diff)
downloadtor-a3ec811c2ee801bf6dd3d7f65c4997470e807c9d.tar.gz
tor-a3ec811c2ee801bf6dd3d7f65c4997470e807c9d.zip
Merge branch 'maint-0.2.8'
Diffstat (limited to 'src/common/memarea.c')
-rw-r--r--src/common/memarea.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/common/memarea.c b/src/common/memarea.c
index 61117288c3..7d16b702e3 100644
--- a/src/common/memarea.c
+++ b/src/common/memarea.c
@@ -83,8 +83,7 @@ typedef struct memarea_chunk_t {
struct memarea_chunk_t *next_chunk;
size_t mem_size; /**< How much RAM is available in mem, total? */
char *next_mem; /**< Next position in mem to allocate data at. If it's
- * greater than or equal to mem+mem_size, this chunk is
- * full. */
+ * equal to mem+mem_size, this chunk is full. */
#ifdef USE_ALIGNED_ATTRIBUTE
/** Actual content of the memory chunk. */
char mem[FLEXIBLE_ARRAY_MEMBER] __attribute__((aligned(MEMAREA_ALIGN)));
@@ -205,7 +204,10 @@ memarea_alloc(memarea_t *area, size_t sz)
tor_assert(sz < SIZE_T_CEILING);
if (sz == 0)
sz = 1;
- if (chunk->next_mem+sz > chunk->U_MEM+chunk->mem_size) {
+ tor_assert(chunk->next_mem <= chunk->U_MEM + chunk->mem_size);
+ const size_t space_remaining =
+ (chunk->U_MEM + chunk->mem_size) - chunk->next_mem;
+ if (sz > space_remaining) {
if (sz+CHUNK_HEADER_SIZE >= CHUNK_SIZE) {
/* This allocation is too big. Stick it in a special chunk, and put
* that chunk second in the list. */