diff options
author | Nick Mathewson <nickm@torproject.org> | 2016-05-25 09:27:35 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2016-05-25 09:27:35 -0400 |
commit | b5e2b3844ab3a1c9fe42d0c83e3e95705dee2900 (patch) | |
tree | 822820461abf92e19b4b3e5b01a72f26e19334de /src/common/memarea.c | |
parent | 0f80dd2a26333ee78a9698b4d3cf8079736f34b5 (diff) | |
parent | fdfc528f85c11a1d29b6a67e32180278d1ca7cbb (diff) | |
download | tor-b5e2b3844ab3a1c9fe42d0c83e3e95705dee2900.tar.gz tor-b5e2b3844ab3a1c9fe42d0c83e3e95705dee2900.zip |
cMerge branch 'maint-0.2.8' into release-0.2.8
Diffstat (limited to 'src/common/memarea.c')
-rw-r--r-- | src/common/memarea.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/common/memarea.c b/src/common/memarea.c index 0a3fd009b0..173ed4e1cb 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. */ |