diff options
| author | Mark Stapp <mjs@voltanet.io> | 2021-03-25 09:56:11 -0400 |
|---|---|---|
| committer | Mark Stapp <mjs@voltanet.io> | 2021-03-25 09:56:11 -0400 |
| commit | cdcb405119fd924c0c71bfc3b7b0295a9a09c327 (patch) | |
| tree | 9a8e14e6dce34bf50e94a01347e9d57346740cc9 /pceplib/pcep_timers.c | |
| parent | 7c94e3d606f6bc75c93361fb59cdeb59aadc866c (diff) | |
libs: fix race in pcep lib
Fix a race in the libpcep timer code; reported by coverity.
Signed-off-by: Mark Stapp <mjs@voltanet.io>
Diffstat (limited to 'pceplib/pcep_timers.c')
| -rw-r--r-- | pceplib/pcep_timers.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/pceplib/pcep_timers.c b/pceplib/pcep_timers.c index e9d9d4b21d..d0a2349d05 100644 --- a/pceplib/pcep_timers.c +++ b/pceplib/pcep_timers.c @@ -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); } |
