summaryrefslogtreecommitdiff
path: root/res
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2017-02-02 10:49:58 -0600
committerGerrit Code Review <gerrit2@gerrit.digium.api>2017-02-02 10:49:58 -0600
commit4e18f9afac03995999b1417300ba8cd91e0c0b78 (patch)
tree9ac375e4023c7ac50b4c7e07ee3617afb123c737 /res
parente4f742de15cc6683172266c1796fbeaf57be6425 (diff)
parente371e13b9eb6ce1f60bf31a8d25c7d4bdcd01d8d (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.c25
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;
}
}