[asterisk-bugs] [JIRA] (ASTERISK-29466) Asterisk crashes when the call hangs up a few seconds before it would send UPDATE
Sunny Narendra (JIRA)
noreply at issues.asterisk.org
Mon Jun 7 05:53:08 CDT 2021
Sunny Narendra created ASTERISK-29466:
-----------------------------------------
Summary: Asterisk crashes when the call hangs up a few seconds before it would send UPDATE
Key: ASTERISK-29466
URL: https://issues.asterisk.org/jira/browse/ASTERISK-29466
Project: Asterisk
Issue Type: Bug
Security Level: None
Components: pjproject/pjsip
Affects Versions: 18.4.0
Reporter: Sunny Narendra
Severity: Major
To reproduce the crash:
* Make Asterisk Session-Expires timer to 120 instead of using the default 1800 (timers_sess_expires=120). With this change the Asterisk will send the UPDATE every 60s.
The call scenario:
* A calls B
* B answers the call
* B hangs up after 0:57
Core dump:
{code:java}
(gdb) bt
#0 __GI_raise (sig=sig at entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1 0x00007f0c75ec242a in __GI_abort () at abort.c:89
#2 0x00007f0c75eb9e67 in __assert_fail_base (fmt=<optimized out>, assertion=assertion at entry=0x7f0c78d15b70 "inv->state < PJSIP_INV_STATE_DISCONNECTED", file=file at entry=0x7f0c78d150af "../src/pjsip-ua/sip_inv.c", line=line at entry=3064,
function=function at entry=0x7f0c78d162b0 <__PRETTY_FUNCTION__.8486> "pjsip_inv_update") at assert.c:92
#3 0x00007f0c75eb9f12 in __GI___assert_fail (assertion=0x7f0c78d15b70 "inv->state < PJSIP_INV_STATE_DISCONNECTED", file=0x7f0c78d150af "../src/pjsip-ua/sip_inv.c", line=3064, function=0x7f0c78d162b0 <__PRETTY_FUNCTION__.8486> "pjsip_inv_update") at assert.c:101
#4 0x00007f0c78c09811 in pjsip_inv_update (inv=0x7f0c68023c68, new_contact=0x0, offer=0x0, p_tdata=0x7f0c245f9ce8) at ../src/pjsip-ua/sip_inv.c:3063
#5 0x00007f0c78c15680 in timer_cb (timer_heap=0x5597b71a04b0, entry=0x7f0c68023ed0) at ../src/pjsip-ua/sip_timer.c:398
#6 0x00007f0c78d0d487 in pj_timer_heap_poll (ht=0x5597b71a04b0, next_delay=0x7f0c245f9e10) at ../src/pj/timer.c:913
#7 0x00007f0c78c33f63 in pjsip_endpt_handle_events2 (endpt=0x5597b71a01c8, max_timeout=0x7f0c245f9e70, p_count=0x0) at ../src/pjsip/sip_endpoint.c:716
#8 0x00007f0c78c340ee in pjsip_endpt_handle_events (endpt=0x5597b71a01c8, max_timeout=0x7f0c245f9e70) at ../src/pjsip/sip_endpoint.c:777
#9 0x00007f0c2b2113e0 in monitor_thread_exec (endpt=0x0) at res_pjsip.c:5166
#10 0x00007f0c78cef7b2 in thread_main (param=0x5597b73cb708) at ../src/pj/os_core_unix.c:541
#11 0x00007f0c7736b4a4 in start_thread (arg=0x7f0c245fa700) at pthread_create.c:456
#12 0x00007f0c75f76d0f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:97
(gdb)
{code}
Following patch seems to fix the issue:
{code:java}
--- a/third-party/pjproject/patches/0011-sip_inv_patch.patch Wed May 12 14:52:42 2021 +0000
+++ b/third-party/pjproject/patches/0011-sip_inv_patch.patch Wed May 12 14:52:57 2021 +0000
@@ -15,11 +15,13 @@
index ca225015b..7c11b1c8e 100644
--- a/pjsip/src/pjsip-ua/sip_inv.c
+++ b/pjsip/src/pjsip-ua/sip_inv.c
-@@ -323,9 +323,19 @@ static void inv_set_state(pjsip_inv_session *inv, pjsip_inv_state state,
+@@ -323,9 +323,20 @@ static void inv_set_state(pjsip_inv_session *inv, pjsip_inv_state state,
(*mod_inv.cb.on_state_changed)(inv, e);
pjsip_inv_dec_ref(inv);
- /* Only decrement when previous state is not already DISCONNECTED */
+- if (state == PJSIP_INV_STATE_DISCONNECTED &&
+- prev_state != PJSIP_INV_STATE_DISCONNECTED)
+ /* The above callback may change the state, so we need to be careful here
+ * and only decrement inv under the following conditions:
+ * 1. If the state parameter is DISCONNECTED, and previous state is not
@@ -30,10 +32,10 @@
+ * inv within the callback. Note that this check must be last since
+ * inv may have already been destroyed.
+ */
- if (state == PJSIP_INV_STATE_DISCONNECTED &&
-- prev_state != PJSIP_INV_STATE_DISCONNECTED)
-+ prev_state != PJSIP_INV_STATE_DISCONNECTED &&
-+ inv->state == PJSIP_INV_STATE_DISCONNECTED)
++ if ((state == PJSIP_INV_STATE_DISCONNECTED &&
++ prev_state != PJSIP_INV_STATE_DISCONNECTED) ||
++ (prev_state != PJSIP_INV_STATE_DISCONNECTED &&
++ inv->state == PJSIP_INV_STATE_DISCONNECTED))
{
pjsip_inv_dec_ref(inv);
}
{code}
--
This message was sent by Atlassian JIRA
(v6.2#6252)
More information about the asterisk-bugs
mailing list