]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
[Core] Fix switch_event_base_add_header leaking memory when headers are with indexes...
authorAndrey Volk <andywolk@gmail.com>
Wed, 3 Nov 2021 14:00:08 +0000 (17:00 +0300)
committerAndrey Volk <andywolk@gmail.com>
Wed, 3 Nov 2021 14:01:05 +0000 (17:01 +0300)
* [Unit-tests] Add a test provoking switch_event_add_header to memory leak.
* [Core] Fix switch_event_base_add_header leaking memory when headers are with indexes.

libs/esl/src/esl_event.c
src/switch_event.c
tests/unit/switch_core.c

index 8a88395ec2791096e875f13b37401678e64704cc..cca7899d8017a9ab3d2f5c0c7b190ce3f5c563b4 100644 (file)
@@ -484,11 +484,14 @@ static esl_status_t esl_event_base_add_header(esl_event_t *event, esl_stack_t st
                                                        exists = 1;
                                                }
 
+                                               FREE(data);
                                                goto redraw;
                                        }
                                } else if (tmp_header) {
                                        free_header(&tmp_header);
                                }
+
+                               FREE(data);
                                goto end;
                        } else {
                                if ((stack & ESL_STACK_PUSH) || (stack & ESL_STACK_UNSHIFT)) {
index 3e5b05ae32b2efa282c57380a3fd851019e46995..a24bee012685e0a80c4b495827ddc98fd2120459 100644 (file)
@@ -1062,11 +1062,14 @@ static switch_status_t switch_event_base_add_header(switch_event_t *event, switc
                                                        exists = 1;
                                                }
 
+                                               FREE(data);
                                                goto redraw;
                                        }
                                } else if (tmp_header) {
                                        free_header(&tmp_header);
                                }
+
+                               FREE(data);
                                goto end;
                        } else {
                                if ((stack & SWITCH_STACK_PUSH) || (stack & SWITCH_STACK_UNSHIFT)) {
index 126921997c6df766cdfe3f09de7fab63833d4cd5..5689513cbc85120c70afb218158c75ba1bab59a1 100644 (file)
@@ -51,6 +51,22 @@ FST_CORE_BEGIN("./conf")
                }
                FST_TEARDOWN_END()
 
+               FST_TEST_BEGIN(test_switch_event_add_header_leak)
+               {
+                       switch_event_t* event;
+
+                       if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_CALLSTATE) == SWITCH_STATUS_SUCCESS) {
+                               switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Channel-Call-State-Number[0]", "1");
+                               switch_event_fire(&event);
+                       }
+
+                       if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_CALLSTATE) == SWITCH_STATUS_SUCCESS) {
+                               switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Channel-Call-State-Number[5000]", "12");
+                               switch_event_fire(&event);
+                       }
+               }
+               FST_TEST_END()
+
                FST_TEST_BEGIN(test_xml_free_attr)
                {
                        switch_xml_t parent_xml = switch_xml_new("xml");