[packages/asterisk] patch to fix chan_pjsip crash on DNS errors
jajcus
jajcus at pld-linux.org
Fri Feb 3 09:25:34 CET 2017
commit 161d3fd57bacf39d7a8e1245edc9917da68f39c5
Author: Jacek Konieczny <j.konieczny at eggsoft.pl>
Date: Fri Feb 3 09:24:13 2017 +0100
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(-)
---
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
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 <jcolp at digium.com>
+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;
+ }
+ }
+
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/asterisk.git/commitdiff/161d3fd57bacf39d7a8e1245edc9917da68f39c5
More information about the pld-cvs-commit
mailing list