From f93445a38c533a4349d3f466380b7625dd7d6243 Mon Sep 17 00:00:00 2001 From: Andrey Volk Date: Tue, 20 Aug 2019 00:39:25 +0400 Subject: [PATCH] FS-12010: [sofia-sip] Fix improper cleanup on su_deinit(). --- libs/sofia-sip/.update | 2 +- .../libsofia-sip-ua/sip/sip_parser.c | 22 +++++++++++++++---- .../sip/sofia-sip/sip_header.h | 3 +++ src/mod/endpoints/mod_sofia/mod_sofia.c | 2 +- src/mod/endpoints/mod_sofia/sofia.c | 1 + 5 files changed, 24 insertions(+), 6 deletions(-) diff --git a/libs/sofia-sip/.update b/libs/sofia-sip/.update index cd3d3611fc..8fcd3faae4 100644 --- a/libs/sofia-sip/.update +++ b/libs/sofia-sip/.update @@ -1 +1 @@ -Tue Aug 13 10:50:57 CDT 2019 +Mon Aug 19 16:25:57 CDT 2019 diff --git a/libs/sofia-sip/libsofia-sip-ua/sip/sip_parser.c b/libs/sofia-sip/libsofia-sip-ua/sip/sip_parser.c index 4d75e705c6..8f1b0d4110 100644 --- a/libs/sofia-sip/libsofia-sip-ua/sip/sip_parser.c +++ b/libs/sofia-sip/libsofia-sip-ua/sip/sip_parser.c @@ -64,6 +64,7 @@ char const sip_version_2_0[] = "SIP/2.0"; extern msg_mclass_t sip_mclass[]; static msg_mclass_t const *_default = sip_mclass; +static msg_mclass_t *_default_parser_cloned = NULL; /** Return a built-in SIP parser object. */ msg_mclass_t const *sip_default_mclass(void) @@ -71,6 +72,15 @@ msg_mclass_t const *sip_default_mclass(void) return _default; } +/** Release SIP parser object if it was cloned. */ +void sip_cloned_parser_destroy(void) +{ + if (_default_parser_cloned) { + free(_default_parser_cloned); + _default_parser_cloned = NULL; + } +} + /** Update the default SIP parser. * * Use the extended SIP parser as default one. @@ -128,10 +138,12 @@ msg_mclass_t *sip_extend_mclass(msg_mclass_t *input) { msg_mclass_t *mclass; - if (input == NULL || input == _default) - mclass = msg_mclass_clone(_default, 0, 0); - else + if (input == NULL || input == _default) { + _default_parser_cloned = msg_mclass_clone(_default, 0, 0); + mclass = _default_parser_cloned; + } else { mclass = input; + } if (mclass) { extern msg_hclass_t * const sip_extensions[]; @@ -143,8 +155,10 @@ msg_mclass_t *sip_extend_mclass(msg_mclass_t *input) continue; if (msg_mclass_insert_header(mclass, hclass, 0) < 0) { - if (input != mclass) + if (input != mclass) { free(mclass); + _default_parser_cloned = NULL; + } return mclass = NULL; } } diff --git a/libs/sofia-sip/libsofia-sip-ua/sip/sofia-sip/sip_header.h b/libs/sofia-sip/libsofia-sip-ua/sip/sofia-sip/sip_header.h index 78d6de525d..9271878459 100644 --- a/libs/sofia-sip/libsofia-sip-ua/sip/sofia-sip/sip_header.h +++ b/libs/sofia-sip/libsofia-sip-ua/sip/sofia-sip/sip_header.h @@ -60,6 +60,9 @@ SOFIA_BEGIN_DECLS /** Return a built-in SIP parser object. */ SOFIAPUBFUN msg_mclass_t const *sip_default_mclass(void); +/** Release SIP parser object if it was cloned. */ +SOFIAPUBFUN void sip_cloned_parser_destroy(void); + SOFIAPUBFUN int sip_update_default_mclass(msg_mclass_t const *mclass); SOFIAPUBFUN msg_mclass_t *sip_extend_mclass(msg_mclass_t *input); diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index c35f37d4fe..848f1e6924 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -6477,7 +6477,7 @@ void mod_sofia_shutdown_cleanup() { Release the clone of the default SIP parser created by `sip_update_default_mclass(sip_extend_mclass(NULL))` call with NULL argument */ - free(sip_default_mclass()); + sip_cloned_parser_destroy(); switch_mutex_lock(mod_sofia_globals.hash_mutex); switch_core_hash_destroy(&mod_sofia_globals.profile_hash); diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 1574798fc1..0b0b1b82a0 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -4290,6 +4290,7 @@ switch_status_t sofia_init(void) su_init(); if (sip_update_default_mclass(sip_extend_mclass(NULL)) < 0) { su_deinit(); + sip_cloned_parser_destroy(); return SWITCH_STATUS_GENERR; }