From: George Joseph Date: Tue, 2 Jan 2018 13:54:54 +0000 (-0700) Subject: res_pjsip: Correct usages of pjproject's timer heap X-Git-Tag: 13.21.0-rc1~22 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cea1a22ef300aff2f3eed5cd472b9c47c7668214;p=thirdparty%2Fasterisk.git res_pjsip: Correct usages of pjproject's timer heap Fix some timer heap initializations and cancels to try and prevent crashes and timer heap issues. Change-Id: I64885d190fa22097d1b55987091375541e57a7ee --- diff --git a/res/res_pjsip_outbound_publish.c b/res/res_pjsip_outbound_publish.c index 6b40ff493e..b170232abf 100644 --- a/res/res_pjsip_outbound_publish.c +++ b/res/res_pjsip_outbound_publish.c @@ -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); diff --git a/res/res_pjsip_outbound_registration.c b/res/res_pjsip_outbound_registration.c index e3799fb2fe..e4faef5190 100644 --- a/res/res_pjsip_outbound_registration.c +++ b/res/res_pjsip_outbound_registration.c @@ -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)); diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c index d74796e519..982fd286e3 100644 --- a/res/res_pjsip_session.c +++ b/res/res_pjsip_session.c @@ -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); } } diff --git a/res/res_pjsip_t38.c b/res/res_pjsip_t38.c index 5f04f0e328..a3cdc57f77 100644 --- a/res/res_pjsip_t38.c +++ b/res/res_pjsip_t38.c @@ -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) : ""); - 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) : ""); 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;