@@ -337,6 +337,7 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
337337
338338static umf_result_t trackingFree (void * hProvider , void * ptr , size_t size ) {
339339 umf_result_t ret ;
340+ umf_result_t ret_remove = UMF_RESULT_ERROR_UNKNOWN ;
340341 umf_tracking_memory_provider_t * p =
341342 (umf_tracking_memory_provider_t * )hProvider ;
342343
@@ -345,13 +346,13 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
345346 // could allocate the memory at address `ptr` before a call to umfMemoryTrackerRemove
346347 // resulting in inconsistent state.
347348 if (ptr ) {
348- ret = umfMemoryTrackerRemove (p -> hTracker , ptr );
349- if (ret != UMF_RESULT_SUCCESS ) {
349+ ret_remove = umfMemoryTrackerRemove (p -> hTracker , ptr );
350+ if (ret_remove != UMF_RESULT_SUCCESS ) {
350351 // DO NOT return an error here, because the tracking provider
351352 // cannot change behaviour of the upstream provider.
352353 LOG_ERR ("failed to remove the region from the tracker, ptr=%p, "
353354 "size=%zu, ret = %d" ,
354- ptr , size , ret );
355+ ptr , size , ret_remove );
355356 }
356357 }
357358
@@ -371,6 +372,12 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
371372 ret = umfMemoryProviderFree (p -> hUpstream , ptr , size );
372373 if (ret != UMF_RESULT_SUCCESS ) {
373374 LOG_ERR ("upstream provider is failed to free the memory" );
375+ // Do not add memory back to the tracker,
376+ // if it had not been removed.
377+ if (ret_remove != UMF_RESULT_SUCCESS ) {
378+ return ret ;
379+ }
380+
374381 if (umfMemoryTrackerAdd (p -> hTracker , p -> pool , ptr , size ) !=
375382 UMF_RESULT_SUCCESS ) {
376383 LOG_ERR (
0 commit comments