]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_pjsip: Correct usages of pjproject's timer heap
authorGeorge Joseph <gjoseph@digium.com>
Tue, 2 Jan 2018 13:54:54 +0000 (06:54 -0700)
committerGeorge Joseph <gjoseph@digium.com>
Mon, 2 Apr 2018 15:17:02 +0000 (10:17 -0500)
Fix some timer heap initializations and cancels to try and prevent
crashes and timer heap issues.

Change-Id: I64885d190fa22097d1b55987091375541e57a7ee

res/res_pjsip_outbound_publish.c
res/res_pjsip_outbound_registration.c
res/res_pjsip_session.c
res/res_pjsip_t38.c

index 6b40ff493e56b0c189adc29b5e858dbff42ef394..b170232abffd9bca9e195cd509f0ab3d25493318 100644 (file)
@@ -291,7 +291,8 @@ static struct ast_sip_event_publisher_handler *find_publisher_handler_for_event_
 /*! \brief Helper function which cancels the refresh timer on a client */
 static void cancel_publish_refresh(struct ast_sip_outbound_publish_client *client)
 {
-       if (pj_timer_heap_cancel(pjsip_endpt_get_timer_heap(ast_sip_get_pjsip_endpoint()), &client->timer)) {
+       if (pj_timer_heap_cancel_if_active(pjsip_endpt_get_timer_heap(ast_sip_get_pjsip_endpoint()),
+               &client->timer, 0)) {
                /* The timer was successfully cancelled, drop the refcount of the client */
                ao2_ref(client, -1);
        }
@@ -1090,8 +1091,7 @@ static struct ast_sip_outbound_publish_state *sip_outbound_publish_state_alloc(
                return NULL;
        }
 
-       state->client->timer.user_data = state->client;
-       state->client->timer.cb = sip_outbound_publish_timer_cb;
+       pj_timer_entry_init(&state->client->timer, 0, state->client, sip_outbound_publish_timer_cb);
        state->client->transport_name = ast_strdup(publish->transport);
        state->client->publish = ao2_bump(publish);
 
index e3799fb2fe6e6d898ed270470c84e240aa487675..e4faef519011d0181748b973f8cfcabef99b62df 100644 (file)
@@ -512,7 +512,8 @@ static struct ast_sip_endpoint_identifier line_identifier = {
 /*! \brief Helper function which cancels the timer on a client */
 static void cancel_registration(struct sip_outbound_registration_client_state *client_state)
 {
-       if (pj_timer_heap_cancel(pjsip_endpt_get_timer_heap(ast_sip_get_pjsip_endpoint()), &client_state->timer)) {
+       if (pj_timer_heap_cancel_if_active(pjsip_endpt_get_timer_heap(ast_sip_get_pjsip_endpoint()),
+               &client_state->timer, client_state->timer.id)) {
                /* The timer was successfully cancelled, drop the refcount of client_state */
                ao2_ref(client_state, -1);
        }
@@ -1130,8 +1131,8 @@ static struct sip_outbound_registration_state *sip_outbound_registration_state_a
        }
 
        state->client_state->status = SIP_REGISTRATION_UNREGISTERED;
-       state->client_state->timer.user_data = state->client_state;
-       state->client_state->timer.cb = sip_outbound_registration_timer_cb;
+       pj_timer_entry_init(&state->client_state->timer, 0, state->client_state,
+               sip_outbound_registration_timer_cb);
        state->client_state->transport_name = ast_strdup(registration->transport);
        state->client_state->registration_name =
                ast_strdup(ast_sorcery_object_get_id(registration));
index d74796e519d732c4f34777bb83cc36b2090ffde0..982fd286e35e87c0d830be081705af176c13aded 100644 (file)
@@ -1883,10 +1883,8 @@ int ast_sip_session_defer_termination(struct ast_sip_session *session)
        session->defer_end = 1;
        session->ended_while_deferred = 0;
 
-       session->scheduled_termination.id = 0;
        ao2_ref(session, +1);
-       session->scheduled_termination.user_data = session;
-       session->scheduled_termination.cb = session_termination_cb;
+       pj_timer_entry_init(&session->scheduled_termination, 0, session, session_termination_cb);
 
        res = (pjsip_endpt_schedule_timer(ast_sip_get_pjsip_endpoint(),
                &session->scheduled_termination, &delay) != PJ_SUCCESS) ? -1 : 0;
@@ -1908,8 +1906,8 @@ int ast_sip_session_defer_termination(struct ast_sip_session *session)
  */
 static void sip_session_defer_termination_stop_timer(struct ast_sip_session *session)
 {
-       if (pj_timer_heap_cancel(pjsip_endpt_get_timer_heap(ast_sip_get_pjsip_endpoint()),
-               &session->scheduled_termination)) {
+       if (pj_timer_heap_cancel_if_active(pjsip_endpt_get_timer_heap(ast_sip_get_pjsip_endpoint()),
+               &session->scheduled_termination, session->scheduled_termination.id)) {
                ao2_ref(session, -1);
        }
 }
index 5f04f0e328ee7172fbe281eabf1948bdf9f84612..a3cdc57f7703bcda0f64a35f2765549299506f96 100644 (file)
@@ -137,7 +137,8 @@ static void t38_change_state(struct ast_sip_session *session, struct ast_sip_ses
                new_state, old_state,
                session->channel ? ast_channel_name(session->channel) : "<gone>");
 
-       if (pj_timer_heap_cancel(pjsip_endpt_get_timer_heap(ast_sip_get_pjsip_endpoint()), &state->timer)) {
+       if (pj_timer_heap_cancel_if_active(pjsip_endpt_get_timer_heap(ast_sip_get_pjsip_endpoint()),
+               &state->timer, 0)) {
                ast_debug(2, "Automatic T.38 rejection on channel '%s' terminated\n",
                        session->channel ? ast_channel_name(session->channel) : "<gone>");
                ao2_ref(session, -1);
@@ -242,8 +243,7 @@ static struct t38_state *t38_state_get_or_alloc(struct ast_sip_session *session)
        state = datastore->data;
 
        /* This will get bumped up before scheduling */
-       state->timer.user_data = session;
-       state->timer.cb = t38_automatic_reject_timer_cb;
+       pj_timer_entry_init(&state->timer, 0, session, t38_automatic_reject_timer_cb);
 
        datastore->data = state;