]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-12010: [sofia-sip] Fix improper cleanup on su_deinit().
authorAndrey Volk <andywolk@gmail.com>
Mon, 19 Aug 2019 20:39:25 +0000 (00:39 +0400)
committerAndrey Volk <andywolk@gmail.com>
Mon, 19 Aug 2019 23:11:28 +0000 (03:11 +0400)
libs/sofia-sip/.update
libs/sofia-sip/libsofia-sip-ua/sip/sip_parser.c
libs/sofia-sip/libsofia-sip-ua/sip/sofia-sip/sip_header.h
src/mod/endpoints/mod_sofia/mod_sofia.c
src/mod/endpoints/mod_sofia/sofia.c

index cd3d3611fca9ed51e4e716f7208935a10c290c2b..8fcd3faae4b766512113120431410ae83ecba747 100644 (file)
@@ -1 +1 @@
-Tue Aug 13 10:50:57 CDT 2019
+Mon Aug 19 16:25:57 CDT 2019
index 4d75e705c672e016cf87020b6230709b5fcd68a0..8f1b0d4110cd929432019143e21038abb1a79a05 100644 (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;
       }
     }
index 78d6de525de03f97b733c385aa22463cdc5ecdec..9271878459be3389eeb097f8e3f4412ed46f45d3 100644 (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);
 
index c35f37d4fefbfb64327f64d817602b03718bfca4..848f1e69240ce803f167f245020509b5df59d517 100644 (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);
index 1574798fc10448327306bc658ddf9f908f250bcb..0b0b1b82a0441a89bf4e91a70f4223cf1ea81ea5 100644 (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;
        }