소스 검색

textops: find start of header body for filter functions

- GH #2748
Daniel-Constantin Mierla 4 년 전
부모
커밋
921b5cbcda
1개의 변경된 파일27개의 추가작업 그리고 13개의 파일을 삭제
  1. 27 13
      src/modules/textops/textops.c

+ 27 - 13
src/modules/textops/textops.c

@@ -1598,7 +1598,7 @@ static inline int find_line_start(char *text, unsigned int text_len,
 }
 
 static inline int find_hdr_line_start(char *hname, unsigned int hname_len,
-		char **buf, unsigned int *buf_len)
+		char **buf, unsigned int *buf_len, char **bstart)
 {
 	hdr_field_t h1;
 	hdr_field_t h2;
@@ -1624,11 +1624,11 @@ static inline int find_hdr_line_start(char *hname, unsigned int hname_len,
 			if(h1.type>0 && h1.type==h2.type) {
 				*buf = start;
 				*buf_len = len;
-				return 1;
-			} else if(cmp_hdrname_str(&h1.name, &h2.name)==0) {
+				goto found;
+			} else if(cmpi_str(&h1.name, &h2.name)==0) {
 				*buf = start;
 				*buf_len = len;
-				return 1;
+				goto found;
 			}
 		}
 		/* jump to next line */
@@ -1645,6 +1645,21 @@ static inline int find_hdr_line_start(char *hname, unsigned int hname_len,
 		}
 	}
 	return 0;
+
+found:
+	ch = memchr(start, ':', len - 1);
+	if(ch==NULL) {
+		LM_ERR("weird - no ':' found\n");
+		return 0;
+	}
+	ch++;
+	while((ch < start + len) && (*ch==' ' || *ch=='\t')) ch++;
+	if(ch==start + len) {
+		LM_ERR("no header body content\n");
+		return 0;
+	}
+	*bstart = ch;
+	return 1;
 }
 
 /**
@@ -1670,6 +1685,7 @@ static int check_multipart(struct sip_msg *msg)
 static int ki_filter_body(struct sip_msg* msg, str *content_type)
 {
 	char *start;
+	char *end;
 	unsigned int len;
 	str body;
 	str boundary = {0,0};
@@ -1695,11 +1711,11 @@ static int ki_filter_body(struct sip_msg* msg, str *content_type)
 	start = body.s;
 	len = body.len;
 
-	while (find_hdr_line_start("Content-Type: ", 14, &start, &len))
+	while (find_hdr_line_start("Content-Type: ", 14, &start, &len, &end))
 	{
-		start = start + 14;
-		len = len - 14;
+		len = len - (end - start);
 		LM_DBG("line: [%.*s]\n", len, start);
+		start = end;
 		if (len > content_type->len + 2) {
 			if (strncasecmp(start, content_type->s, content_type->len)== 0)
 			{
@@ -3239,10 +3255,9 @@ static int ki_remove_multibody(sip_msg_t* msg, str* content_type)
 	start = body.s;
 	len = body.len;
 
-	while (find_hdr_line_start("Content-Type: ", 14, &start, &len))
+	while (find_hdr_line_start("Content-Type: ", 14, &start, &len, &end))
 	{
-		end = start + 14;
-		len = len - 14;
+		len = len - (end - start);
 		if (len > (content_type->len + 2)) {
 			if (strncasecmp(end, content_type->s, content_type->len)== 0)
 			{
@@ -3345,10 +3360,9 @@ static int ki_get_body_part_helper(sip_msg_t* msg, str* ctype, pv_spec_t *dst,
 	len = body.len;
 
 	/* note: header body can follow just after name: - fixit */
-	while (find_hdr_line_start("Content-Type: ", 14, &start, &len))
+	while (find_hdr_line_start("Content-Type: ", 14, &start, &len, &end))
 	{
-		end = start + 14;
-		len = len - 14;
+		len = len - (end - start);
 		if (len > (ctype->len + 2)) {
 			if (strncasecmp(end, ctype->s, ctype->len)== 0)
 			{