mirror of https://github.com/sipwise/sems.git
commit 22b8f00398f7fcffc291063c19dae46a11f41227
Author: Raphael Coeffic <rco@iptel.org>
Date: Tue Apr 15 14:49:49 2014 +0200
sip: b/f: check method (ACK or PRACK) before deleting transaction
In case PRACK is received after 200, the transaction would be removed without checking the method.
agranig/notify
parent
207610c317
commit
99ca300e96
Notes:
Jenkins User
10 years ago
jenkins_trigger: false
@ -0,0 +1,80 @@
|
||||
From ade15d176e363612c489013c70563eca542d457e Mon Sep 17 00:00:00 2001
|
||||
From: Andrew Pogrebennyk <apogrebennyk@sipwise.com>
|
||||
Date: Wed, 16 Apr 2014 10:40:00 +0200
|
||||
Subject: [PATCH] MT#6475 check method (ACK or PRACK) before deleting
|
||||
transaction
|
||||
|
||||
commit 22b8f00398f7fcffc291063c19dae46a11f41227
|
||||
Author: Raphael Coeffic <rco@iptel.org>
|
||||
Date: Tue Apr 15 14:49:49 2014 +0200
|
||||
|
||||
sip: b/f: check method (ACK or PRACK) before deleting transaction
|
||||
|
||||
In case PRACK is received after 200, the transaction would be removed without checking the method.
|
||||
---
|
||||
core/sip/trans_layer.cpp | 27 +++++++++++++++++++--------
|
||||
1 file changed, 19 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/core/sip/trans_layer.cpp b/core/sip/trans_layer.cpp
|
||||
index 277f44c..67775a5 100644
|
||||
--- a/core/sip/trans_layer.cpp
|
||||
+++ b/core/sip/trans_layer.cpp
|
||||
@@ -1588,22 +1588,31 @@ int _trans_layer::update_uas_reply(trans_bucket* bucket, sip_trans* t, int reply
|
||||
int _trans_layer::update_uas_request(trans_bucket* bucket, sip_trans* t, sip_msg* msg)
|
||||
{
|
||||
DBG("update_uas_request(t=%p)\n", t);
|
||||
+ int method = msg->u.request->method;
|
||||
+
|
||||
+ if(method != sip_request::ACK &&
|
||||
+ method != sip_request::PRACK) {
|
||||
|
||||
- if(msg->u.request->method != sip_request::ACK &&
|
||||
- msg->u.request->method != sip_request::PRACK){
|
||||
ERROR("Bug? Recvd non PR-/ACK request for existing UAS transact.!?\n");
|
||||
return -1;
|
||||
}
|
||||
-
|
||||
+
|
||||
switch(t->state){
|
||||
|
||||
+ case TS_PROCEEDING:
|
||||
+ // ACK or PRACK after non-reliable 1xx???
|
||||
+ return -1;
|
||||
+
|
||||
case TS_PROCEEDING_REL:
|
||||
- // stop retransmissions
|
||||
- t->clear_timer(STIMER_G);
|
||||
- t->clear_timer(STIMER_H);
|
||||
+ if(method == sip_request::PRACK) {
|
||||
+ // stop retransmissions
|
||||
+ t->clear_timer(STIMER_G);
|
||||
+ t->clear_timer(STIMER_H);
|
||||
+ }
|
||||
return t->state;
|
||||
|
||||
- case TS_COMPLETED:
|
||||
+ case TS_COMPLETED: // non-2xx-ACK
|
||||
+ if(method != sip_request::ACK) return -1;
|
||||
t->state = TS_CONFIRMED;
|
||||
|
||||
t->clear_timer(STIMER_G);
|
||||
@@ -1615,13 +1624,15 @@ int _trans_layer::update_uas_request(trans_bucket* bucket, sip_trans* t, sip_msg
|
||||
case TS_CONFIRMED:
|
||||
return t->state;
|
||||
|
||||
- case TS_TERMINATED_200:
|
||||
+ case TS_TERMINATED_200: // 2xx-ACK
|
||||
+ if(method != sip_request::ACK) return -1;
|
||||
// remove transaction
|
||||
bucket->remove(t);
|
||||
return TS_REMOVED;
|
||||
|
||||
default:
|
||||
DBG("Bug? Unknown state at this point: %i\n",t->state);
|
||||
+ break;
|
||||
}
|
||||
|
||||
return -1;
|
||||
--
|
||||
1.8.5.2 (Apple Git-48)
|
||||
|
||||
Loading…
Reference in new issue