< Previous by Date Date Index Next by Date >
< Previous in Thread Thread Index Next in Thread >

Re: [reSIProcate] crash after receiving invalid Via line


Further detail & possible fix:

bool    
SipMessage::exists(const HeaderBase& headerType) const 
{
//patch for crash if Via does not contain a body:
        HeaderFieldValueList *hfvl = mHeaders[headerType.getTypeNum()];
   return (hfvl!= 0) && (!hfvl->empty()) ;
};

It looks like with the above patch the following code is now called:

Transport::basicCheck(const SipMessage& msg)
{
   resip::Data reason;
   if (msg.isExternal())
   {
      try
      {
         if (!Helper::validateMessage(msg,&reason))
         {
            InfoLog(<<"Message Failed basicCheck :" << msg.brief());

And when the response is set to the wire an assertion is called:

TransactionState:1666:

assert(sip->exists(h_Vias));


Will this patch work ok?


Thanks,

-Justin

-----Original Message-----
From: Justin Matthews [mailto:jmatthewsr@xxxxxxxxx] 
Sent: Friday, November 03, 2006 3:39 PM
To: 'resiprocate-devel@xxxxxxxxxxxxxxxxxxx'
Subject: crash after receiving invalid Via line

The stack is crashing when receiving a request with a via line equal to
"Via: ".  The actual crash occurs in SipMessage.cxx:435,
SipMessage::getRFC2543TransactionId, when accessing the via header.  The
header exists in the mheaders container of the SipMessage, but it does not
contain any values, so the front() call on line 435 fails.

Can some initial checking be done in the MsgHeaderScanner.cxx,
processMsgHeaderStatusLine() to drop this message?

Thanks,

-Justin



Example request:

CANCEL sip:dest@xxxxxxxxxxxx SIP/2.0
Via: 
From: "12345" <sip:12345@xxxxxxxxxxxx>
To: <sip:dest@xxxxxxxxxxxx>
Call-ID: D71644F5-560F-44BE-AB36-F5FF7790A349@xxxxxxxxxxxx
Date: Fri, 03 Nov 2006 23:01:23 GMT
CSeq: 0 CANCEL
Contact: <sip:12345@xxxxxxxxxxxx:5060>
Content-Length: 0