Skip to content

Commit 45358d8

Browse files
committed
check for alloc fails in disjoint pool init
1 parent feeb424 commit 45358d8

File tree

1 file changed

+43
-7
lines changed

1 file changed

+43
-7
lines changed

src/pool/pool_disjoint.c

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -588,12 +588,6 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
588588
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
589589
}
590590

591-
disjoint_pool_t *disjoint_pool =
592-
umf_ba_global_alloc(sizeof(*disjoint_pool));
593-
if (!disjoint_pool) {
594-
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
595-
}
596-
597591
umf_disjoint_pool_params_t *dp_params =
598592
(umf_disjoint_pool_params_t *)params;
599593

@@ -604,12 +598,21 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
604598
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
605599
}
606600

601+
disjoint_pool_t *disjoint_pool =
602+
umf_ba_global_alloc(sizeof(*disjoint_pool));
603+
if (disjoint_pool == NULL) {
604+
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
605+
}
606+
607607
VALGRIND_DO_CREATE_MEMPOOL(disjoint_pool, 0, 0);
608608

609609
disjoint_pool->provider = provider;
610610
disjoint_pool->params = *dp_params;
611611

612612
disjoint_pool->known_slabs = critnib_new();
613+
if (disjoint_pool->known_slabs == NULL) {
614+
goto err_free_disjoint_pool;
615+
}
613616

614617
// Generate buckets sized such as: 64, 96, 128, 192, ..., CutOff.
615618
// Powers of 2 and the value halfway between the powers of 2.
@@ -625,6 +628,9 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
625628
disjoint_pool->min_bucket_size_exp = (size_t)log2Utils(Size1);
626629
disjoint_pool->default_shared_limits =
627630
umfDisjointPoolSharedLimitsCreate(SIZE_MAX);
631+
if (disjoint_pool->default_shared_limits == NULL) {
632+
goto err_free_known_slabs;
633+
}
628634

629635
// count number of buckets, start from 1
630636
disjoint_pool->buckets_num = 1;
@@ -633,10 +639,14 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
633639
for (; Size2 < CutOff; Size1 *= 2, Size2 *= 2) {
634640
disjoint_pool->buckets_num += 2;
635641
}
642+
636643
disjoint_pool->buckets = umf_ba_global_alloc(
637644
sizeof(*disjoint_pool->buckets) * disjoint_pool->buckets_num);
645+
if (disjoint_pool->buckets == NULL) {
646+
goto err_free_shared_limits;
647+
}
638648

639-
int i = 0;
649+
size_t i = 0;
640650
Size1 = ts1;
641651
Size2 = ts2;
642652
for (; Size2 < CutOff; Size1 *= 2, Size2 *= 2, i += 2) {
@@ -648,6 +658,13 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
648658
disjoint_pool->buckets[i] = create_bucket(
649659
CutOff, disjoint_pool, disjoint_pool_get_limits(disjoint_pool));
650660

661+
// check if all buckets were created successfully
662+
for (i = 0; i < disjoint_pool->buckets_num; i++) {
663+
if (disjoint_pool->buckets[i] == NULL) {
664+
goto err_free_buckets;
665+
}
666+
}
667+
651668
umf_result_t ret = umfMemoryProviderGetMinPageSize(
652669
provider, NULL, &disjoint_pool->provider_min_page_size);
653670
if (ret != UMF_RESULT_SUCCESS) {
@@ -657,6 +674,25 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
657674
*ppPool = (void *)disjoint_pool;
658675

659676
return UMF_RESULT_SUCCESS;
677+
678+
err_free_buckets:
679+
for (i = 0; i < disjoint_pool->buckets_num; i++) {
680+
if (disjoint_pool->buckets[i] != NULL) {
681+
destroy_bucket(disjoint_pool->buckets[i]);
682+
}
683+
}
684+
umf_ba_global_free(disjoint_pool->buckets);
685+
686+
err_free_shared_limits:
687+
umfDisjointPoolSharedLimitsDestroy(disjoint_pool->default_shared_limits);
688+
689+
err_free_known_slabs:
690+
critnib_delete(disjoint_pool->known_slabs);
691+
692+
err_free_disjoint_pool:
693+
umf_ba_global_free(disjoint_pool);
694+
695+
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
660696
}
661697

662698
void *disjoint_pool_malloc(void *pool, size_t size) {

0 commit comments

Comments
 (0)