Module: sip-router
Branch: master
Commit: 4b220639cb255a20bac762fd60e36a4336339a45
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=4b22063…
Author: Juha Heinanen <jh(a)tutpro.com>
Committer: Juha Heinanen <jh(a)tutpro.com>
Date: Tue Sep 20 09:46:53 2011 +0300
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.
---
modules_k/nathelper/nathelper.c | 44 ++++++++++++++++++++++++++++----------
1 files changed, 32 insertions(+), 12 deletions(-)
diff --git a/modules_k/nathelper/nathelper.c b/modules_k/nathelper/nathelper.c
index a7186d7..f734a8d 100644
--- a/modules_k/nathelper/nathelper.c
+++ b/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");