|
@@ -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");
|