@@ -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
651687void * disjoint_pool_malloc (void * pool , size_t size ) {
0 commit comments