From eb48c349c64433dd4d95dd5a185d74c390924474 Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Mon, 25 Jan 2021 08:51:48 +0100 Subject: Fixed memory leak, caused by not freeing saved events --- src/sip/sip.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/sip/sip.c b/src/sip/sip.c index 49ce49c..3721034 100644 --- a/src/sip/sip.c +++ b/src/sip/sip.c @@ -41,6 +41,8 @@ #undef NUTAG_AUTO100 +#define NUTAG_WITH_THIS_MSG(msg) nutag_with, tag_ptr_v(msg) + static void invite_option_timeout(struct timer *timer); call_t *call_create(sip_endpoint_t *sip_ep) @@ -856,7 +858,6 @@ static void ep_i_register(sip_endpoint_t *sip_ep, int status, nua_t *nua, nua_ha { PDEBUG(DSIP, DEBUG_INFO, "Received REGISTER (registration)\n"); - #define NUTAG_WITH_THIS_MSG(msg) nutag_with, tag_ptr_v(msg) nua_saved_event_t saved[1]; nua_save_event(nua, saved); nua_event_data_t const *data = nua_event_data(saved); @@ -878,6 +879,7 @@ static void ep_i_register(sip_endpoint_t *sip_ep, int status, nua_t *nua, nua_ha PDEBUG(DSIP, DEBUG_DEBUG, "forbidden, because we don't accept registration"); PDEBUG(DSIP, DEBUG_INFO, "Sending REGISTER response: %d %s (registration)\n", SIP_403_FORBIDDEN); nua_respond(nh, SIP_403_FORBIDDEN, NUTAG_WITH_THIS_MSG(data->e_msg), TAG_END()); + nua_destroy_event(saved); PDEBUG(DSIP, DEBUG_DEBUG, "destroying nua_handle %p (register)\n", nh); nua_handle_destroy(nh); sip_ep->register_handle = NULL; @@ -909,6 +911,7 @@ static void ep_i_register(sip_endpoint_t *sip_ep, int status, nua_t *nua, nua_ha PDEBUG(DSIP, DEBUG_INFO, "Sending REGISTER response: %d %s (registration)\n", status, auth_text); nua_respond(nh, status, auth_text, SIPTAG_CONTACT(sip->sip_contact), NUTAG_WITH_THIS_MSG(data->e_msg), TAG_IF(auth_str[0], SIPTAG_WWW_AUTHENTICATE_STR(auth_str)), TAG_END()); + nua_destroy_event(saved); PDEBUG(DSIP, DEBUG_DEBUG, "destroying nua_handle %p (register)\n", nh); nua_handle_destroy(nh); sip_ep->register_handle = NULL; @@ -967,7 +970,6 @@ static void ep_i_options(nua_t *nua, nua_handle_t *nh) { PDEBUG(DSIP, DEBUG_INFO, "Received OPTIONS (registration)\n"); - #define NUTAG_WITH_THIS_MSG(msg) nutag_with, tag_ptr_v(msg) nua_saved_event_t saved[1]; nua_save_event(nua, saved); nua_event_data_t const *data = nua_event_data(saved); @@ -975,6 +977,9 @@ static void ep_i_options(nua_t *nua, nua_handle_t *nh) PDEBUG(DSIP, DEBUG_INFO, "Sending OPTIONS response: %d %s (registration)\n", SIP_200_OK); nua_respond(nh, SIP_200_OK, NUTAG_WITH_THIS_MSG(data->e_msg), TAG_END()); + nua_destroy_event(saved); + + // NOTE: nh will be destroyed by caller of this function } static void ep_r_options(sip_endpoint_t __attribute__((unused)) *sip_ep, int status, char const *phrase, nua_handle_t __attribute__((unused)) *nh) @@ -1276,7 +1281,6 @@ static void call_i_info(call_t *call, nua_t *nua, nua_handle_t *nh, sip_t const char digit = '\0'; osmo_cc_msg_t *msg; - #define NUTAG_WITH_THIS_MSG(msg) nutag_with, tag_ptr_v(msg) nua_saved_event_t saved[1]; nua_save_event(nua, saved); nua_event_data_t const *data = nua_event_data(saved); @@ -1316,6 +1320,7 @@ static void call_i_info(call_t *call, nua_t *nua, nua_handle_t *nh, sip_t const PDEBUG(DSIP, DEBUG_INFO, "Sending INFO response: %d %s (callref %d)\n", SIP_200_OK, call->cc_callref); nua_respond(nh, SIP_200_OK, NUTAG_WITH_THIS_MSG(data->e_msg), TAG_END()); + nua_destroy_event(saved); if (digit) { char digits[2] = { digit, '\0' }; -- cgit v1.2.3