hi,

i faced with strange behavior during processing of the 200 ACK with
wrong To-tag.

transaction layer matches such ACK with INVITE transaction only by
branch here:
core/sip/trans_layer.cpp:
<pre>
91 sip_trans* trans_bucket::match_request(sip_msg* msg, unsigned int ttype)
92 {
...
139  // match non-200 ACK first
140  if(compare_branch(*it,msg,branch,(unsigned int)len)) {
141    t = *it;
142    break;
143  }
...
</pre>

comment says that this code should match only non-200 ACK requests, but
branch-only matching makes code with full checks (match_200_ack)
unreachable.

this lines were added in commit
5910b550db43485a1b52b25e233f3badeaa023c6
which was intended to fix non-200 ACK matching in reply to responses
without To-tag.

also later  function
bool AmEventDispatcher::post(const string& local_tag, AmEvent* ev)
[core/AmEventDispatcher.cpp:154]
can't find appropriate dialog using To-tag and upper layers never
receive event.

thus we have:
 - possible wrong matching of the 200ACK request for UAS transaction.
   (RFC says that 200ACK matching MUST include To-tag comparison)
 - inconsistency between transaction layer and SIP dispatcher
   (transaction removed but ACK request event not received by session.
   can cause session hangup in the absence of external requests or rtp
timeout [because H timer will never fire])

please, take a look

-- 
Best Regards
Michael Furmur
_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev

Reply via email to