From 0e5d8ad09bf8b51d7f5eaed5de308ee05703d87b Mon Sep 17 00:00:00 2001 From: Corey Farrell Date: Mon, 18 Dec 2017 19:59:57 -0500 Subject: chan_sip: Fix memory leaks. In change_redirecting_information variables we use ast_strlen_zero to see if a value should be saved. In the case where the value is not NULL but is a zero length string we leaked. handle_response_subscribe leaked a reference to the ccss monitor instance. Change-Id: Ib11444de69c3d5b2360a88ba2feb54d2c2e9f05f --- channels/chan_sip.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 522e9d1d6..e6e82db46 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -23168,6 +23168,8 @@ static void change_redirecting_information(struct sip_pvt *p, struct sip_request redirecting->from.number.valid = 1; ast_free(redirecting->from.number.str); redirecting->from.number.str = redirecting_from_number; + } else { + ast_free(redirecting_from_number); } if (!ast_strlen_zero(redirecting_from_name)) { ast_debug(3, "Got redirecting from name %s\n", redirecting_from_name); @@ -23175,6 +23177,8 @@ static void change_redirecting_information(struct sip_pvt *p, struct sip_request redirecting->from.name.valid = 1; ast_free(redirecting->from.name.str); redirecting->from.name.str = redirecting_from_name; + } else { + ast_free(redirecting_from_name); } if (!ast_strlen_zero(p->cid_tag)) { ast_free(redirecting->from.tag); @@ -23188,13 +23192,17 @@ static void change_redirecting_information(struct sip_pvt *p, struct sip_request redirecting->to.number.valid = 1; ast_free(redirecting->to.number.str); redirecting->to.number.str = redirecting_to_number; + } else { + ast_free(redirecting_to_number); } if (!ast_strlen_zero(redirecting_to_name)) { - ast_debug(3, "Got redirecting to name %s\n", redirecting_from_number); + ast_debug(3, "Got redirecting to name %s\n", redirecting_to_name); update_redirecting->to.name = 1; redirecting->to.name.valid = 1; ast_free(redirecting->to.name.str); redirecting->to.name.str = redirecting_to_name; + } else { + ast_free(redirecting_to_name); } redirecting->reason.code = reason; ast_free(redirecting->reason.str); @@ -24223,6 +24231,7 @@ static void handle_response_subscribe(struct sip_pvt *p, int resp, const char *r ast_cc_monitor_failed(monitor_instance->core_id, monitor_instance->device_name, "Received error response to our SUBSCRIBE"); + ao2_ref(monitor_instance, -1); } return; } -- cgit v1.2.3