From 161d3fd57bacf39d7a8e1245edc9917da68f39c5 Mon Sep 17 00:00:00 2001 From: Jacek Konieczny Date: Fri, 3 Feb 2017 09:24:13 +0100 Subject: [PATCH] patch to fix chan_pjsip crash on DNS errors fixes: https://issues.asterisk.org/jira/browse/ASTERISK-26679 https://issues.asterisk.org/jira/browse/ASTERISK-26699 --- ASTERISK-26679.patch | 76 ++++++++++++++++++++++++++++++++++++++++++++ asterisk.spec | 4 ++- 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 ASTERISK-26679.patch diff --git a/ASTERISK-26679.patch b/ASTERISK-26679.patch new file mode 100644 index 0000000..a620162 --- /dev/null +++ b/ASTERISK-26679.patch @@ -0,0 +1,76 @@ +From e371e13b9eb6ce1f60bf31a8d25c7d4bdcd01d8d Mon Sep 17 00:00:00 2001 +From: Joshua Colp +Date: Tue, 31 Jan 2017 17:17:50 +0000 +Subject: [PATCH] res_pjsip: Handle invocation of callback on outgoing request when error occurs. + +There are some error cases in PJSIP when sending a request that will +result in the callback for the request being invoked. The code did not +handle this case and assumed on every error case that the callback was not +invoked. + +The code has been changed to check whether the callback has been invoked +and if so to absorb the error and treat it as a success. + +ASTERISK-26679 +ASTERISK-26699 + +Change-Id: I563982ba204da5aa1428989a11c06dd9087fea91 +--- + +diff --git a/res/res_pjsip.c b/res/res_pjsip.c +index 12c3baa..c35b782 100644 +--- a/res/res_pjsip.c ++++ b/res/res_pjsip.c +@@ -3402,6 +3402,8 @@ + 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. */ +@@ -3418,6 +3420,12 @@ + { + 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 @@ + 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 @@ + 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; + } + } + diff --git a/asterisk.spec b/asterisk.spec index 0a8660f..ad52c9e 100644 --- a/asterisk.spec +++ b/asterisk.spec @@ -38,7 +38,7 @@ Summary: Asterisk PBX Summary(pl.UTF-8): Centralka (PBX) Asterisk Name: asterisk Version: 13.13.1 -Release: 1 +Release: 2 License: GPL v2 Group: Applications/System Source0: http://downloads.digium.com/pub/asterisk/releases/%{name}-%{version}.tar.gz @@ -63,6 +63,7 @@ Patch5: %{name}-histedit.patch Patch6: x32.patch Patch7: %{name}-ilbc.patch Patch8: asterisk-opus.patch +Patch9: ASTERISK-26679.patch URL: http://www.asterisk.org/ BuildRequires: OSPToolkit-devel >= 4.0.0 %{?with_oss:BuildRequires: SDL-devel} @@ -756,6 +757,7 @@ Dokumentacja API Asteriska. %patch5 -p1 %patch6 -p1 %patch7 -p1 +%patch9 -p1 %if %{with opus_vp8} %patch8 -p1 -- 2.44.0