[reSIProcate] ParseBuffer::assertNotEof() ?

Daniel Pocock daniel at readytechnology.co.uk
Sat Sep 30 03:38:46 CDT 2006


Looking at my own case below, is the packet with an empty `tag=' 
parameter valid?

To: "Booth2" <sip:11 at sip.callshop.lvdx.com>;tag=

Line 28 of DataParameter.cxx calls pb.assertNotEof(); - could the 
following be done safely:

if(pb.eof()) {
  mValue = Data("");
  return;
}

or is there some other code that depends on the parameter having a value?


Byron Campen wrote:

>     This sounds like a bug in dum. If an exception due to a parse  
> failure is making it out of dum, then it is very likely the stack has  
> leaked a TransactionState. If the exception is not caught in the  
> appropriate place, not only is the SipMessage leaked, but there is no  
> way to respond to it, meaning the TransactionState will never get  
> cleaned up either (the stack waits indefinitely for the TU to respond).
>
>     Unfortunately, there are many such bugs, because a lot of the 
> code  was written before we transitioned to a lazy-parser, and the 
> code was  never fixed. The upshot is that calling something like 
> msg.header (h_HeaderName).someAccessor() will probably be what 
> triggers the  parse of the header, and if that header is malformed, 
> kaboom!
>
>     Fixing all the instances of this will take some time. I tried my  
> best to clear up any errors of this type that existed in the stack  
> (and I think I've gotten them all). I think that, at this point, it  
> would make sense to add bool LazyParser::isWellFormed(), so we can  
> check whether the header is well-formed in an exception-safe manner.  
> This will make fixing the existing code a little easier. And for  
> those who are writing new code, keep this in mind!
>
>     Now, I added a bandage for this problem that people can use in 
> the  meantime. As a configure option, you can set PEDANTIC_STACK to 
> true,  which cause the stack to do a full parse of SipMessages on 
> receipt.  If a problem is discovered, it will be rejected immediately. 
> (ie, no  potential for a parse to fail later down the line, since 
> everything  is already parsed) This is an expensive solution, but at 
> least you  have the option.
>
> Best regards,
> Byron Campen
>
>>
>>
>> Occasionally, my application is receiving a packet which causes
>> assertNotEof() to throw an exception.
>>
>> How is this exception meant to be dealt with?  Am I intended to  
>> catch it
>> with a try { } catch { } block around dum->process()?  Or should this
>> exception be caught and handled (presumably by discarding the packet)
>> within the stack?
>>
>> Here is the content of pb when the exception is thrown, the code in
>> DataParameter.cxx suggests the empty ;tag= is the fault:
>>
>> (gdb) print pb
>> $1 = (class resip::ParseBuffer &) @0xbfffe114: {
>>   static Whitespace = 0xb7ac4264 " \t\r\n",
>>   static ParamTerm = 0xb7ac4261 ";?",
>>   mBuff = 0x809dd4a "\"Booth2\"
>> <sip:11 at sip.callshop.lvdx.com>;tag=\r\nTo:
>> <sip:11 at sip.callshop.lvdx.com>;tag=\r\nContact:
>> <sip:11 at 83.146.x.x:5070>\r\nSupported: replaces\r\nProxy- Authorization:
>> Digest username=\"11\", realm=\"sip."..., mPosition = 0x809dd76 "\r 
>> \nTo:
>> <sip:11 at sip.callshop.lvdx.com>;tag=\r\nContact:
>> <sip:11 at 83.146.x.x:5070>\r\nSupported: replaces\r\nProxy- Authorization:
>> Digest username=\"11\", realm=\"sip.callshop.lvdx.com\",  algorithm=MD5,
>> uri=\"sip:"...,
>>   mEnd = 0x809dd76 "\r\nTo:
>> <sip:11 at sip.callshop.lvdx.com>;tag=\r\nContact:
>> <sip:11 at 83.146.x.x:5070>\r\nSupported: replaces\r\nProxy- Authorization:
>> Digest username=\"11\", realm=\"sip.callshop.lvdx.com\",  algorithm=MD5,
>> uri=\"sip:"...,
>>   mErrorContext = @0xb7dc5c18}
>>
>>
>> Regards,
>>
>> Daniel
>> _______________________________________________
>> resiprocate-devel mailing list
>> resiprocate-devel at list.sipfoundry.org
>> https://list.sipfoundry.org/mailman/listinfo/resiprocate-devel
>
>



More information about the resiprocate-devel mailing list