[sr-dev] git:master:fe6923cd: lost: change in the method for parsing the From header in lost_get_from_header() related to #2723

Wolfgang Kampichler dev at kampichler.info
Tue May 4 23:27:57 CEST 2021


Module: kamailio
Branch: master
Commit: fe6923cd8e995c400fc1838304c95142cc00273e
URL: https://github.com/kamailio/kamailio/commit/fe6923cd8e995c400fc1838304c95142cc00273e

Author: Wolfgang Kampichler <dev at kampichler.info>
Committer: Wolfgang Kampichler <dev at kampichler.info>
Date: 2021-05-04T23:24:53+02:00

lost: change in the method for parsing the From header in lost_get_from_header() related to #2723

---

Modified: src/modules/lost/utilities.c

---

Diff:  https://github.com/kamailio/kamailio/commit/fe6923cd8e995c400fc1838304c95142cc00273e.diff
Patch: https://github.com/kamailio/kamailio/commit/fe6923cd8e995c400fc1838304c95142cc00273e.patch

---

diff --git a/src/modules/lost/utilities.c b/src/modules/lost/utilities.c
index bcb045f451..beb1d2e932 100644
--- a/src/modules/lost/utilities.c
+++ b/src/modules/lost/utilities.c
@@ -442,9 +442,10 @@ p_lost_geolist_t lost_get_geolocation_header(struct sip_msg *msg, int *items)
 	str hdr = STR_NULL;
 	p_lost_geolist_t list = NULL;
 
+	*items = 0;
+
 	if(parse_headers(msg, HDR_EOH_F, 0) == -1) {
 		LM_ERR("failed to parse SIP headers\n");
-		*items = 0;
 		return list;
 	}
 
@@ -481,8 +482,8 @@ char *lost_get_pai_header(struct sip_msg *msg, int *lgth)
 
 	*lgth = 0;
 
-	if(parse_headers(msg, HDR_PAI_F, 0) == -1) {
-		LM_ERR("could not parse P-A-I header\n");
+	if(parse_headers(msg, HDR_EOH_F, 0) == -1) {
+		LM_ERR("failed to parse SIP headers\n");
 		return res;
 	}
 
@@ -640,34 +641,53 @@ int lost_get_nameinfo(char *ip, str *name, int flag)
  */
 char *lost_get_from_header(struct sip_msg *msg, int *lgth)
 {
-	to_body_t *f_body;
+	struct hdr_field *hf;
+	to_body_t *from_body;
 	char *res = NULL;
 
 	*lgth = 0;
 
-	if(parse_headers(msg, HDR_FROM_F, 0) == -1) {
-		LM_ERR("failed to parse From header\n");
+	if(parse_headers(msg, HDR_EOH_F, 0) == -1) {
+		LM_ERR("failed to parse SIP headers\n");
 		return res;
 	}
 
-	if(msg->from == NULL || get_from(msg) == NULL) {
-		LM_ERR("From header not found\n");
-		return res;
-	}
-	f_body = get_from(msg);
+	for(hf = msg->headers; hf; hf = hf->next) {
+		if(hf->type == HDR_FROM_T) {
 
-	LM_DBG("From body:  [%.*s]\n", f_body->body.len, f_body->body.s);
+			LM_DBG("From body:  [%.*s]\n", hf->body.len, hf->body.s);
 
-	res = (char *)pkg_malloc((f_body->uri.len + 1) * sizeof(char));
-	if(res == NULL) {
-		PKG_MEM_ERROR;
-		return res;
-	} else {
-		memset(res, 0, f_body->uri.len + 1);
-		memcpy(res, f_body->uri.s, f_body->uri.len + 1);
-		res[f_body->uri.len] = '\0';
+			/* first, get some memory */
+			from_body = pkg_malloc(sizeof(to_body_t));
+			if(from_body == NULL) {
+				PKG_MEM_ERROR;
+				return res;
+			}
+			/* parse From body */
+			memset(from_body, 0, sizeof(to_body_t));
+			parse_to(hf->body.s, hf->body.s + hf->body.len + 1, from_body);
+			if(from_body->error == PARSE_ERROR) {
+				LM_ERR("bad From header\n");
+				pkg_free(from_body);
+				return res;
+			}
+			if(from_body->error == PARSE_OK) {
+				res = (char *)pkg_malloc(
+						(from_body->uri.len + 1) * sizeof(char));
+				if(res == NULL) {
+					PKG_MEM_ERROR;
+					pkg_free(from_body);
+					return res;
+				} else {
+					memset(res, 0, from_body->uri.len + 1);
+					memcpy(res, from_body->uri.s, from_body->uri.len + 1);
+					res[from_body->uri.len] = '\0';
+					pkg_free(from_body);
 
-		*lgth = strlen(res);
+					*lgth = strlen(res);
+				}
+			}
+		}
 	}
 
 	return res;




More information about the sr-dev mailing list