FS-12010: [sofia-sip] Fix improper cleanup on su_deinit().

This commit is contained in:
Andrey Volk 2019-08-20 00:39:25 +04:00
parent 96aac32237
commit f93445a38c
5 changed files with 24 additions and 6 deletions

View File

@ -1 +1 @@
Tue Aug 13 10:50:57 CDT 2019
Mon Aug 19 16:25:57 CDT 2019

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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);

View File

@ -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;
}