From ded2a4c1beaf9bed6d7666fe505e8392fff5eca6 Mon Sep 17 00:00:00 2001 From: Andrey Volk Date: Wed, 30 Nov 2022 23:18:55 +0300 Subject: [PATCH] [Core] Fix crash in enterprise originate: memory fence the handles. --- src/switch_ivr_originate.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/switch_ivr_originate.c b/src/switch_ivr_originate.c index 31b326bc1f..f1e3e39de1 100644 --- a/src/switch_ivr_originate.c +++ b/src/switch_ivr_originate.c @@ -1465,6 +1465,7 @@ typedef struct { int done; switch_thread_t *thread; switch_mutex_t *mutex; + switch_mutex_t *fence_mutex; switch_dial_handle_t *dh; } enterprise_originate_handle_t; @@ -1479,9 +1480,13 @@ struct ent_originate_ringback { static void *SWITCH_THREAD_FUNC enterprise_originate_thread(switch_thread_t *thread, void *obj) { enterprise_originate_handle_t *handle = (enterprise_originate_handle_t *) obj; + switch_status_t status; + switch_mutex_lock(handle->fence_mutex); handle->done = 0; - handle->status = switch_ivr_originate(NULL, &handle->bleg, &handle->cause, + switch_mutex_unlock(handle->fence_mutex); + + status = switch_ivr_originate(NULL, &handle->bleg, &handle->cause, handle->bridgeto, handle->timelimit_sec, handle->table, handle->cid_name_override, @@ -1492,8 +1497,11 @@ static void *SWITCH_THREAD_FUNC enterprise_originate_thread(switch_thread_t *thr &handle->cancel_cause, handle->dh); - + switch_mutex_lock(handle->fence_mutex); + handle->status = status; handle->done = 1; + switch_mutex_unlock(handle->fence_mutex); + switch_mutex_lock(handle->mutex); switch_mutex_unlock(handle->mutex); @@ -1697,6 +1705,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_enterprise_originate(switch_core_sess switch_dial_handle_dup(&handles[i].dh, hl->handles[i]); } switch_mutex_init(&handles[i].mutex, SWITCH_MUTEX_NESTED, pool); + switch_mutex_init(&handles[i].fence_mutex, SWITCH_MUTEX_NESTED, pool); switch_mutex_lock(handles[i].mutex); switch_thread_create(&handles[i].thread, thd_attr, enterprise_originate_thread, &handles[i], pool); } @@ -1738,13 +1747,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_enterprise_originate(switch_core_sess for (i = 0; i < x_argc; i++) { - + switch_mutex_lock(handles[i].fence_mutex); if (handles[i].done == 0) { running++; } else if (handles[i].done == 1) { if (handles[i].status == SWITCH_STATUS_SUCCESS) { handles[i].done = 2; hp = &handles[i]; + switch_mutex_unlock(handles[i].fence_mutex); goto done; } else { handles[i].done = -1; @@ -1753,6 +1763,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_enterprise_originate(switch_core_sess over++; } + switch_mutex_unlock(handles[i].fence_mutex); + switch_yield(10000); }