瀏覽代碼

modules_k/nathelper: fix_nated_sdp("1") fix

- Call fix_nated_sdp("1") now adds a=direction:active line after every
  m line in sdp.  Earlier it just added one a=direction:active line at
  the end of body.
Juha Heinanen 14 年之前
父節點
當前提交
4b220639cb
共有 1 個文件被更改,包括 32 次插入12 次删除
  1. 32 12
      modules_k/nathelper/nathelper.c

+ 32 - 12
modules_k/nathelper/nathelper.c

@@ -1352,8 +1352,8 @@ fix_nated_sdp_f(struct sip_msg* msg, char* str1, char* str2)
 {
 	str body;
 	str ip;
-	int level;
-	char *buf;
+	int level, rest_len;
+	char *buf, *m_start, *m_end, *rest_s;
 	struct lump* anchor;
 
 	level = (int)(long)str1;
@@ -1366,28 +1366,48 @@ fix_nated_sdp_f(struct sip_msg* msg, char* str1, char* str2)
 	}
 
 	if (level & (ADD_ADIRECTION | ADD_ANORTPPROXY)) {
+
 		msg->msg_flags |= FL_FORCE_ACTIVE;
-		anchor = anchor_lump(msg, body.s + body.len - msg->buf, 0, 0);
-		if (anchor == NULL) {
-			LM_ERR("anchor_lump failed\n");
-			return -1;
-		}
+
 		if (level & ADD_ADIRECTION) {
+		    m_start = ser_memmem(body.s, "\r\nm=", body.len, 4);
+		    while (m_start != NULL) {
+			m_start = m_start + 2;
+			rest_len = body.len - (m_start - body.s);
+			m_end = ser_memmem(m_start, "\r\n", rest_len, 2);
+			if (m_end == NULL) {
+			    LM_ERR("m line is not crlf terminated\n");
+			    return -1;
+			}
+		        anchor = anchor_lump(msg, m_end - msg->buf, 0, 0);
+		        if (anchor == NULL) {
+			    LM_ERR("anchor_lump failed\n");
+			    return -1;
+		        }
 			buf = pkg_malloc((ADIRECTION_LEN + CRLF_LEN) * sizeof(char));
 			if (buf == NULL) {
-				LM_ERR("out of pkg memory\n");
-				return -1;
+			    LM_ERR("out of pkg memory\n");
+			    return -1;
 			}
 			memcpy(buf, CRLF, CRLF_LEN);
 			memcpy(buf + CRLF_LEN, ADIRECTION, ADIRECTION_LEN);
 			if (insert_new_lump_after(anchor, buf, ADIRECTION_LEN + CRLF_LEN, 0) == NULL) {
-				LM_ERR("insert_new_lump_after failed\n");
-				pkg_free(buf);
-				return -1;
+			    LM_ERR("insert_new_lump_after failed\n");
+			    pkg_free(buf);
+			    return -1;
 			}
+			rest_s = m_end + 2;
+			rest_len = body.len - (rest_s - body.s);
+			m_start = ser_memmem(rest_s, "\r\nm=", rest_len, 4);
+		    }
 		}
 
 		if ((level & ADD_ANORTPPROXY) && nortpproxy_str.len) {
+		        anchor = anchor_lump(msg, body.s + body.len - msg->buf, 0, 0);
+		        if (anchor == NULL) {
+			        LM_ERR("anchor_lump failed\n");
+			        return -1;
+		        }
 			buf = pkg_malloc((nortpproxy_str.len + CRLF_LEN) * sizeof(char));
 			if (buf == NULL) {
 				LM_ERR("out of pkg memory\n");