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