diff options
author | Joshua Colp <jcolp@digium.com> | 2017-02-02 10:49:58 -0600 |
---|---|---|
committer | Gerrit Code Review <gerrit2@gerrit.digium.api> | 2017-02-02 10:49:58 -0600 |
commit | 4e18f9afac03995999b1417300ba8cd91e0c0b78 (patch) | |
tree | 9ac375e4023c7ac50b4c7e07ee3617afb123c737 /res | |
parent | e4f742de15cc6683172266c1796fbeaf57be6425 (diff) | |
parent | e371e13b9eb6ce1f60bf31a8d25c7d4bdcd01d8d (diff) |
Merge "res_pjsip: Handle invocation of callback on outgoing request when error occurs." into 13
Diffstat (limited to 'res')
-rw-r--r-- | res/res_pjsip.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/res/res_pjsip.c b/res/res_pjsip.c index 12c3baa0d..c35b7826f 100644 --- a/res/res_pjsip.c +++ b/res/res_pjsip.c @@ -3402,6 +3402,8 @@ struct send_request_wrapper { void (*callback)(void *token, pjsip_event *e); /*! Non-zero when the callback is called. */ unsigned int cb_called; + /*! Non-zero if endpt_send_request_cb() was called. */ + unsigned int send_cb_called; /*! Timeout timer. */ pj_timer_entry *timeout_timer; /*! Original timeout. */ @@ -3419,6 +3421,12 @@ static void endpt_send_request_cb(void *token, pjsip_event *e) struct send_request_wrapper *req_wrapper = token; unsigned int cb_called; + /* + * Needed because we cannot otherwise tell if this callback was + * called when pjsip_endpt_send_request() returns error. + */ + req_wrapper->send_cb_called = 1; + if (e->body.tsx_state.type == PJSIP_EVENT_TIMER) { ast_debug(2, "%p: PJSIP tsx timer expired\n", req_wrapper); @@ -3602,12 +3610,10 @@ static pj_status_t endpt_send_request(struct ast_sip_endpoint *endpoint, if (ret_val != PJ_SUCCESS) { char errmsg[PJ_ERR_MSG_SIZE]; - /* - * endpt_send_request_cb is not expected to ever be called - * because the request didn't get far enough to attempt - * sending. - */ - ao2_ref(req_wrapper, -1); + if (!req_wrapper->send_cb_called) { + /* endpt_send_request_cb is not expected to ever be called now. */ + ao2_ref(req_wrapper, -1); + } /* Complain of failure to send the request. */ pj_strerror(ret_val, errmsg, sizeof(errmsg)); @@ -3644,6 +3650,13 @@ static pj_status_t endpt_send_request(struct ast_sip_endpoint *endpoint, req_wrapper->cb_called = 1; } ao2_unlock(req_wrapper); + } else if (req_wrapper->cb_called) { + /* + * We cannot report any error. The callback has + * already freed any resources associated with + * token. + */ + ret_val = PJ_SUCCESS; } } |