[sr-dev] git:master: lib/ims:modules/ims_charging, ims_icscf, ims_qos, ims_registrar_scscf: fixed pkg_mem leak

Jason Penton jason.penton at gmail.com
Fri Feb 14 09:02:10 CET 2014


Module: sip-router
Branch: master
Commit: 1d6b1d8765d7a6d21c291d2076a3a80a1710c11c
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=1d6b1d8765d7a6d21c291d2076a3a80a1710c11c

Author: Jason Penton <jason.penton at gmail.com>
Committer: Jason Penton <jason.penton at gmail.com>
Date:   Fri Feb 14 09:57:45 2014 +0200

lib/ims:modules/ims_charging,ims_icscf,ims_qos,ims_registrar_scscf: fixed pkg_mem leak
	- fixed leak when parsing msg headers on a shm msg
	- instead now pass in flag to say if parsing is on shm_msg or not (is_shm)
	- assumes all common headers are already parsed before pkg_mem msg is cloned

---

 lib/ims/ims_getters.c                          |   33 ++++++++++++++++++-----
 lib/ims/ims_getters.h                          |    3 +-
 modules/ims_charging/ims_ro.c                  |    4 +-
 modules/ims_icscf/location.c                   |    2 +-
 modules/ims_qos/rx_aar.c                       |   13 +++++++--
 modules/ims_registrar_scscf/registrar_notify.c |    4 +-
 modules/ims_registrar_scscf/save.c             |    2 +-
 7 files changed, 44 insertions(+), 17 deletions(-)

diff --git a/lib/ims/ims_getters.c b/lib/ims/ims_getters.c
index 082a5c2..aa37c7d 100644
--- a/lib/ims/ims_getters.c
+++ b/lib/ims/ims_getters.c
@@ -388,13 +388,32 @@ str s_asserted_identity={"P-Asserted-Identity",19};
  * @param msg - the sip message
  * @returns the asserted identity
  */
-str cscf_get_asserted_identity(struct sip_msg *msg)
-{
-	str uri = {0,0};
-	if (!msg) return uri;
-	if((parse_pai_header(msg) == 0) && (msg->pai) && (msg->pai->parsed)) {
+str cscf_get_asserted_identity(struct sip_msg *msg, int is_shm) {
+	int len;
+	str uri = { 0, 0 };
+
+	if (!msg || !msg->pai)
+		return uri;
+
+	if ((parse_pai_header(msg) == 0) && (msg->pai) && (msg->pai->parsed)) {
 		to_body_t *pai = get_pai(msg)->id;
-		return pai->uri;
+		if (!is_shm)
+			return pai->uri;
+
+		//make a pkg malloc str to return to consuming function
+		len = pai->uri.len + 1;
+		uri.s = (char*) pkg_malloc(pai->uri.len + 1);
+		if (!uri.s) {
+			LM_ERR("no more pkg mem\n");
+			return uri;
+		}
+		memset(uri.s, 0, len);
+		memcpy(uri.s, pai->uri.s, pai->uri.len);
+		uri.len = pai->uri.len;
+
+		p_id_body_t* ptr = (p_id_body_t*) msg->pai->parsed;
+		msg->pai->parsed = 0;
+		free_pai_ppi_body(ptr);
 	}
 	return uri;
 }
@@ -855,7 +874,7 @@ int cscf_is_initial_request(struct sip_msg *msg)
 int cscf_get_originating_user( struct sip_msg * msg, str *uri )
 {
 	struct to_body * from;
-	*uri = cscf_get_asserted_identity(msg);
+	*uri = cscf_get_asserted_identity(msg, 0);
 	if (!uri->len) {		
 		/* Fallback to From header */
 		if ( parse_from_header( msg ) == -1 ) {
diff --git a/lib/ims/ims_getters.h b/lib/ims/ims_getters.h
index 0b01ffc..2217ddc 100644
--- a/lib/ims/ims_getters.h
+++ b/lib/ims/ims_getters.h
@@ -153,9 +153,10 @@ int cscf_has_originating(struct sip_msg *msg, char *str1, char *str2);
 /**
  * Looks for the P-Asserted-Identity header and extracts its content
  * @param msg - the sip message
+ * @is_shm - is the message a shm message
  * @returns the asserted identity
  */
-str cscf_get_asserted_identity(struct sip_msg *msg);
+str cscf_get_asserted_identity(struct sip_msg *msg, int is_shm);
 /**
  * Extracts the realm from a SIP/TEL URI. 
  * - SIP - the hostname
diff --git a/modules/ims_charging/ims_ro.c b/modules/ims_charging/ims_ro.c
index f650e90..ab5937a 100644
--- a/modules/ims_charging/ims_ro.c
+++ b/modules/ims_charging/ims_ro.c
@@ -361,7 +361,7 @@ int get_sip_header_info(struct sip_msg * req,
     *expires = cscf_get_expires_hdr(req, 0);
     *callid = cscf_get_call_id(req, NULL);
 
-    if ((*asserted_id_uri = cscf_get_asserted_identity(req)).len == 0) {
+    if ((*asserted_id_uri = cscf_get_asserted_identity(req, 0)).len == 0) {
     	LM_DBG("No P-Asserted-Identity hdr found. Using From hdr");
 
     	if (!cscf_get_from_uri(req, asserted_id_uri)) {
@@ -955,7 +955,7 @@ int Ro_Send_CCR(struct sip_msg *msg, str* direction, str* charge_type, str* unit
 
 
     //getting asserted identity
-    if ((asserted_identity = cscf_get_asserted_identity(msg)).len == 0) {
+    if ((asserted_identity = cscf_get_asserted_identity(msg, 0)).len == 0) {
 	    LM_DBG("No P-Asserted-Identity hdr found. Using From hdr for asserted_identity");
 	    asserted_identity	= dlg->from_uri;
     }
diff --git a/modules/ims_icscf/location.c b/modules/ims_icscf/location.c
index 3d0f09a..4aac051 100644
--- a/modules/ims_icscf/location.c
+++ b/modules/ims_icscf/location.c
@@ -98,7 +98,7 @@ int I_perform_location_information_request(struct sip_msg* msg, char* route, cha
 
     /* extract data from message */
     if (orig) {
-        public_identity = cscf_get_asserted_identity(msg);
+        public_identity = cscf_get_asserted_identity(msg, 0);
     } else {
         public_identity = cscf_get_public_identity_from_requri(msg);
     }
diff --git a/modules/ims_qos/rx_aar.c b/modules/ims_qos/rx_aar.c
index 69d04c0..3d7fc22 100644
--- a/modules/ims_qos/rx_aar.c
+++ b/modules/ims_qos/rx_aar.c
@@ -411,7 +411,7 @@ int rx_send_aar(struct sip_msg *req, struct sip_msg *res,
         AAASession* auth, char* direction, saved_transaction_t* saved_t_data) {
 
     AAAMessage* aar = 0;
-
+    int must_free_asserted_identity = 0;
     
     str identifier;
     int identifier_type;
@@ -494,17 +494,20 @@ int rx_send_aar(struct sip_msg *req, struct sip_msg *res,
     
     if (dlg_direction == DLG_MOBILE_ORIGINATING) {
 	LM_DBG("originating direction\n");
-	if ((identifier = cscf_get_asserted_identity(req)).len == 0) {
+	if ((identifier = cscf_get_asserted_identity(req, 1)).len == 0) {
 	    LM_DBG("No P-Asserted-Identity hdr found in request. Using From hdr in req");
 
 	    if (!cscf_get_from_uri(req, &identifier)) {
 		    LM_ERR("Error assigning P-Asserted-Identity using From hdr in req");
 		    goto error;
 	    }
+	} else {
+	                must_free_asserted_identity = 1;
 	}
     } else {
 	LM_DBG("terminating direction\n");
-	if ((identifier = cscf_get_asserted_identity(res)).len == 0) {
+
+	if ((identifier = cscf_get_asserted_identity(res, 0)).len == 0) {
 	    LM_DBG("No P-Asserted-Identity hdr found in response. Using To hdr in resp");
 
 	    if (!cscf_get_to_uri(res, &identifier)) {
@@ -522,6 +525,10 @@ int rx_send_aar(struct sip_msg *req, struct sip_msg *res,
     
     
     rx_add_subscription_id_avp(aar, identifier, identifier_type);
+    if (must_free_asserted_identity) {
+            pkg_free(identifier.s);
+    }
+
 
     LM_DBG("Adding reservation priority...\n");
     /* Add Reservation Priority AVP*/
diff --git a/modules/ims_registrar_scscf/registrar_notify.c b/modules/ims_registrar_scscf/registrar_notify.c
index 1fc1f07..3f04dbe 100644
--- a/modules/ims_registrar_scscf/registrar_notify.c
+++ b/modules/ims_registrar_scscf/registrar_notify.c
@@ -153,7 +153,7 @@ int can_publish_reg(struct sip_msg *msg, char *_t, char *str2) {
 	    goto done;
 	}
 
-	asserted_id = cscf_get_asserted_identity(msg);
+	asserted_id = cscf_get_asserted_identity(msg, 0);
 	if (!asserted_id.len) {
 	    LM_ERR("P-Asserted-Identity empty.\n");
 	    goto error;
@@ -312,7 +312,7 @@ int can_subscribe_to_reg(struct sip_msg *msg, char *_t, char *str2) {
     }
 
 
-    asserted_id = cscf_get_asserted_identity(msg);
+    asserted_id = cscf_get_asserted_identity(msg, 0);
     if (!asserted_id.len) {
         LM_ERR("P-Asserted-Identity empty.\n");
         goto error;
diff --git a/modules/ims_registrar_scscf/save.c b/modules/ims_registrar_scscf/save.c
index a54728c..78d5793 100644
--- a/modules/ims_registrar_scscf/save.c
+++ b/modules/ims_registrar_scscf/save.c
@@ -987,7 +987,7 @@ int assign_server_unreg(struct sip_msg* _m, char* str1, str* direction, char* ro
     enum cscf_dialog_direction dir = cscf_get_dialog_direction(direction->s);
     switch (dir) {
         case CSCF_MOBILE_ORIGINATING:
-            public_identity = cscf_get_asserted_identity(_m);
+            public_identity = cscf_get_asserted_identity(_m, 0);
             break;
         case CSCF_MOBILE_TERMINATING:
             public_identity = cscf_get_public_identity_from_requri(_m);




More information about the sr-dev mailing list