|
@@ -80,8 +80,7 @@ typedef struct memarea_chunk_t {
|
|
|
struct memarea_chunk_t *next_chunk;
|
|
|
size_t mem_size;
|
|
|
char *next_mem;
|
|
|
- * 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
|
|
|
char mem[FLEXIBLE_ARRAY_MEMBER] __attribute__((aligned(MEMAREA_ALIGN)));
|
|
|
#else
|
|
@@ -237,7 +236,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) {
|
|
|
|
|
|
* that chunk second in the list. */
|