Module: kamailio
Branch: 5.0
Commit: ffdc513e75d0ca294ff697ffc19cf2d45beb68dd
URL:
https://github.com/kamailio/kamailio/commit/ffdc513e75d0ca294ff697ffc19cf2d…
Author: lazedo <luis.azedo(a)factorlusitano.com>
Committer: Luis Azedo <luis(a)2600hz.com>
Date: 2017-11-29T11:11:03Z
nat_traversal: handle local generated transactions (#1344)
* nat_traversal: fix local generated transactions
* nat_traversal: handle TMCB_RESPONSE_SENT only for FAKED_REPLY
* nat_traversal: free allocated buffer
(cherry picked from commit 886f14e11e3e5fe9d2bc56fd37d2102ae5b99645)
---
Modified: src/modules/nat_traversal/nat_traversal.c
---
Diff:
https://github.com/kamailio/kamailio/commit/ffdc513e75d0ca294ff697ffc19cf2d…
Patch:
https://github.com/kamailio/kamailio/commit/ffdc513e75d0ca294ff697ffc19cf2d…
---
diff --git a/src/modules/nat_traversal/nat_traversal.c
b/src/modules/nat_traversal/nat_traversal.c
index ae38d7653b..3ddee233d6 100644
--- a/src/modules/nat_traversal/nat_traversal.c
+++ b/src/modules/nat_traversal/nat_traversal.c
@@ -1358,17 +1358,42 @@ __sl_reply_out(sl_cbp_t *slcbp)
static void
__tm_reply_in(struct cell *trans, int type, struct tmcb_params *param)
{
- time_t expire;
+ time_t expire = 0;
if (param->req==NULL || param->rpl==NULL)
return;
+ if(type == TMCB_RESPONSE_SENT && param->rpl!=FAKED_REPLY)
+ return;
+
if (param->code >= 200 && param->code < 300) {
switch (param->req->REQ_METHOD) {
case METHOD_SUBSCRIBE:
- expire = get_expires(param->rpl);
- if (expire > 0)
+ if(type == TMCB_RESPONSE_SENT) {
+ char* tmp = pkg_malloc(param->send_buf.len+1);
+ if(tmp) {
+ sip_msg_t msg;
+ strncpy(tmp, param->send_buf.s, param->send_buf.len);
+ tmp[param->send_buf.len] = '\0';
+ memset(&msg, 0, sizeof(sip_msg_t));
+ msg.buf=tmp;
+ msg.len=param->send_buf.len;
+ if(parse_msg(tmp, param->send_buf.len, &msg) != 0) {
+ LM_ERR("ERROR PARSING REPLY\n");
+ } else {
+ expire = get_expires(&msg);
+ }
+ free_sip_msg(&msg);
+ pkg_free(tmp);
+ }
+ } else {
+ expire = get_expires(param->rpl);
+ }
+ if (expire > 0) {
keepalive_subscription(param->req, expire);
+ } else {
+ LM_DBG("expires == 0\n");
+ }
break;
case METHOD_REGISTER:
expire = get_register_expire(param->req, param->rpl);
@@ -1404,7 +1429,7 @@ NAT_Keepalive(struct sip_msg *msg)
// fallthrough
case METHOD_SUBSCRIBE:
msg->msg_flags |= FL_DO_KEEPALIVE;
- if (tm_api.register_tmcb(msg, 0, TMCB_RESPONSE_IN, __tm_reply_in, 0, 0) <= 0)
{
+ if (tm_api.register_tmcb(msg, 0, TMCB_RESPONSE_IN | TMCB_RESPONSE_SENT,
__tm_reply_in, 0, 0) <= 0) {
LM_ERR("cannot register TM callback for incoming replies\n");
return -1;
}