]> git.puffer.fish Git - matthieu/frr.git/commitdiff
libs: fix race in pcep lib
authorMark Stapp <mjs@voltanet.io>
Thu, 25 Mar 2021 13:56:11 +0000 (09:56 -0400)
committerMark Stapp <mjs@voltanet.io>
Thu, 25 Mar 2021 13:56:11 +0000 (09:56 -0400)
Fix a race in the libpcep timer code; reported by coverity.

Signed-off-by: Mark Stapp <mjs@voltanet.io>
pceplib/pcep_timers.c

index e9d9d4b21d9a8991750a8e290a79b5df8ae93e3e..d0a2349d058785ee8269fa1f57e475b1f9b63f8c 100644 (file)
@@ -457,10 +457,17 @@ void pceplib_external_timer_expire_handler(void *data)
        }
 
        pcep_timer *timer = (pcep_timer *)data;
+
        pthread_mutex_lock(&timers_context_->timer_list_lock);
        ordered_list_node *timer_node =
                ordered_list_find2(timers_context_->timer_list, timer,
                                   timer_list_node_timer_ptr_compare);
+
+       /* Remove timer from list */
+       if (timer_node)
+               ordered_list_remove_node2(timers_context_->timer_list,
+                                         timer_node);
+
        pthread_mutex_unlock(&timers_context_->timer_list_lock);
 
        /* Cannot continue if the timer does not exist */
@@ -474,9 +481,5 @@ void pceplib_external_timer_expire_handler(void *data)
 
        timers_context_->expire_handler(timer->data, timer->timer_id);
 
-       pthread_mutex_lock(&timers_context_->timer_list_lock);
-       ordered_list_remove_node2(timers_context_->timer_list, timer_node);
-       pthread_mutex_unlock(&timers_context_->timer_list_lock);
-
        pceplib_free(PCEPLIB_INFRA, timer);
 }