[asterisk-bugs] [JIRA] (ASTERISK-29466) Asterisk crashes (when built in developer mode) when the call hangs up a few seconds before it would send UPDATE
Joshua C. Colp (JIRA)
noreply at issues.asterisk.org
Mon Jun 7 06:47:08 CDT 2021
[ https://issues.asterisk.org/jira/browse/ASTERISK-29466?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Joshua C. Colp updated ASTERISK-29466:
--------------------------------------
Summary: Asterisk crashes (when built in developer mode) when the call hangs up a few seconds before it would send UPDATE (was: Asterisk crashes when the call hangs up a few seconds before it would send UPDATE)
> Asterisk crashes (when built in developer mode) 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
> Assignee: Unassigned
>
> 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