sip/dialplan_functions.c: Fix /channels/chan_sip/test_sip_rtpqos crash.
authorRichard Mudgett <rmudgett@digium.com>
Tue, 15 Mar 2016 19:51:25 +0000 (14:51 -0500)
committerRichard Mudgett <rmudgett@digium.com>
Wed, 16 Mar 2016 19:22:19 +0000 (14:22 -0500)
This patch is part of a series to resolve deadlocks in chan_sip.c.

Delaying destruction of the chan_sip sip_pvt structures caused the
/channels/chan_sip/test_sip_rtpqos unit test to crash.  That test
registers a special test ast_rtp_engine with the rtp engine module.  When
the unit test completes it cleans up by unregistering the test
ast_rtp_engine and exits.  Since the delayed destruction of the sip_pvt
happens after the unit test returns, the destructor tries to call the rtp
engine destroy callback of the test ast_rtp_engine auto variable which no
longer exists on the stack.

* Change the test ast_rtp_engine auto variable to a static variable.  Now
the variable can still exist after the unit test exits so the delayed
sip_pvt destruction can complete successfully.

ASTERISK-25023

Change-Id: I61e34a12d425189ef7e96fc69ae14993f82f3f13

channels/sip/dialplan_functions.c

index 33ba71c..644da38 100644 (file)
@@ -273,7 +273,7 @@ static int test_sip_rtpqos_1_get_stat(struct ast_rtp_instance *instance, struct
 AST_TEST_DEFINE(test_sip_rtpqos_1)
 {
        int i, res = AST_TEST_PASS;
 AST_TEST_DEFINE(test_sip_rtpqos_1)
 {
        int i, res = AST_TEST_PASS;
-       struct ast_rtp_engine test_engine = {
+       static struct ast_rtp_engine test_engine = {
                .name = "test",
                .new = test_sip_rtpqos_1_new,
                .destroy = test_sip_rtpqos_1_destroy,
                .name = "test",
                .new = test_sip_rtpqos_1_new,
                .destroy = test_sip_rtpqos_1_destroy,