Skip to content

Commit 23cbc0c

Browse files
authored
Merge pull request #1162 from bratpiorka/rrudnick_fix_dp_coverity
check for alloc fails in disjoint pool init
2 parents 92da225 + 45358d8 commit 23cbc0c

File tree

1 file changed

+43
-7
lines changed

1 file changed

+43
-7
lines changed

src/pool/pool_disjoint.c

+43-7
Original file line numberDiff line numberDiff line change
@@ -577,12 +577,6 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
577577
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
578578
}
579579

580-
disjoint_pool_t *disjoint_pool =
581-
umf_ba_global_alloc(sizeof(*disjoint_pool));
582-
if (!disjoint_pool) {
583-
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
584-
}
585-
586580
umf_disjoint_pool_params_t *dp_params =
587581
(umf_disjoint_pool_params_t *)params;
588582

@@ -593,12 +587,21 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
593587
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
594588
}
595589

590+
disjoint_pool_t *disjoint_pool =
591+
umf_ba_global_alloc(sizeof(*disjoint_pool));
592+
if (disjoint_pool == NULL) {
593+
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
594+
}
595+
596596
VALGRIND_DO_CREATE_MEMPOOL(disjoint_pool, 0, 0);
597597

598598
disjoint_pool->provider = provider;
599599
disjoint_pool->params = *dp_params;
600600

601601
disjoint_pool->known_slabs = critnib_new();
602+
if (disjoint_pool->known_slabs == NULL) {
603+
goto err_free_disjoint_pool;
604+
}
602605

603606
// Generate buckets sized such as: 64, 96, 128, 192, ..., CutOff.
604607
// Powers of 2 and the value halfway between the powers of 2.
@@ -614,6 +617,9 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
614617
disjoint_pool->min_bucket_size_exp = (size_t)utils_msb64(Size1);
615618
disjoint_pool->default_shared_limits =
616619
umfDisjointPoolSharedLimitsCreate(SIZE_MAX);
620+
if (disjoint_pool->default_shared_limits == NULL) {
621+
goto err_free_known_slabs;
622+
}
617623

618624
// count number of buckets, start from 1
619625
disjoint_pool->buckets_num = 1;
@@ -622,10 +628,14 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
622628
for (; Size2 < CutOff; Size1 *= 2, Size2 *= 2) {
623629
disjoint_pool->buckets_num += 2;
624630
}
631+
625632
disjoint_pool->buckets = umf_ba_global_alloc(
626633
sizeof(*disjoint_pool->buckets) * disjoint_pool->buckets_num);
634+
if (disjoint_pool->buckets == NULL) {
635+
goto err_free_shared_limits;
636+
}
627637

628-
int i = 0;
638+
size_t i = 0;
629639
Size1 = ts1;
630640
Size2 = ts2;
631641
for (; Size2 < CutOff; Size1 *= 2, Size2 *= 2, i += 2) {
@@ -637,6 +647,13 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
637647
disjoint_pool->buckets[i] = create_bucket(
638648
CutOff, disjoint_pool, disjoint_pool_get_limits(disjoint_pool));
639649

650+
// check if all buckets were created successfully
651+
for (i = 0; i < disjoint_pool->buckets_num; i++) {
652+
if (disjoint_pool->buckets[i] == NULL) {
653+
goto err_free_buckets;
654+
}
655+
}
656+
640657
umf_result_t ret = umfMemoryProviderGetMinPageSize(
641658
provider, NULL, &disjoint_pool->provider_min_page_size);
642659
if (ret != UMF_RESULT_SUCCESS) {
@@ -646,6 +663,25 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
646663
*ppPool = (void *)disjoint_pool;
647664

648665
return UMF_RESULT_SUCCESS;
666+
667+
err_free_buckets:
668+
for (i = 0; i < disjoint_pool->buckets_num; i++) {
669+
if (disjoint_pool->buckets[i] != NULL) {
670+
destroy_bucket(disjoint_pool->buckets[i]);
671+
}
672+
}
673+
umf_ba_global_free(disjoint_pool->buckets);
674+
675+
err_free_shared_limits:
676+
umfDisjointPoolSharedLimitsDestroy(disjoint_pool->default_shared_limits);
677+
678+
err_free_known_slabs:
679+
critnib_delete(disjoint_pool->known_slabs);
680+
681+
err_free_disjoint_pool:
682+
umf_ba_global_free(disjoint_pool);
683+
684+
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
649685
}
650686

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

0 commit comments

Comments
 (0)