Skip to content

Commit 99b1c19

Browse files
committed
Fix: make umf_ba_linear_alloc(0) always return NULL
umf_ba_linear_alloc(0) didn't return NULL and umf_ba_linear_free(umf_ba_linear_alloc(0)) always failed, because pool_contains_ptr(umf_ba_linear_alloc(0)) always returned false, since umf_ba_linear_alloc(0) pointed at the very end of the pool (ptr == (char *)pool + pool_size). Fixes: #260 Signed-off-by: Lukasz Dorau <lukasz.dorau@intel.com>
1 parent b415e78 commit 99b1c19

File tree

2 files changed

+8
-4
lines changed

2 files changed

+8
-4
lines changed

src/base_alloc/base_alloc_linear.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,9 @@ umf_ba_linear_pool_t *umf_ba_linear_create(size_t pool_size) {
118118
}
119119

120120
void *umf_ba_linear_alloc(umf_ba_linear_pool_t *pool, size_t size) {
121+
if (size == 0) {
122+
return NULL;
123+
}
121124
size_t aligned_size = ALIGN_UP(size, MEMORY_ALIGNMENT);
122125
util_mutex_lock(&pool->metadata.lock);
123126
if (pool->metadata.size_left < aligned_size) {

test/test_base_alloc_linear.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,11 @@ TEST_F(test, baseAllocLinearMultiThreadedAllocMemset) {
7373
} buffer[ITERATIONS];
7474

7575
for (int i = 0; i < ITERATIONS; i++) {
76-
buffer[i].size =
77-
(size_t)((rand() / (double)RAND_MAX) * MAX_ALLOCATION_SIZE);
78-
buffer[i].ptr =
79-
(unsigned char *)umf_ba_linear_alloc(pool, buffer[i].size);
76+
// size must be greater than 0
77+
size_t size = (size_t)(1 + (MAX_ALLOCATION_SIZE - 1) *
78+
(rand() / (double)RAND_MAX));
79+
buffer[i].size = size;
80+
buffer[i].ptr = (unsigned char *)umf_ba_linear_alloc(pool, size);
8081
UT_ASSERTne(buffer[i].ptr, NULL);
8182
memset(buffer[i].ptr, (i + TID) & 0xFF, buffer[i].size);
8283
}

0 commit comments

Comments
 (0)