Re: Segementation fault in onGotSDES

Michel de Boer <[email protected]>
Newsgroups gmane.comp.gnu.ccrtp.devel
Message-ID <[email protected]>
David,

That would be great. Then it can be included the next Suse beta release.

Regards,
Michel


David Sugar wrote:
> As soon as federico has a chance to also look at it, I could get an 
> updated release together.
> 
> David
> 
> Michel de Boer wrote:
> 
>> David, Federico,
>>
>> After some extensive debugging I managed to find the cause
>> for the segmentation fault. It took me several sleepless hours :-)
>>
>> In QueueRTCPManager::takeInControlPacket() you traverse the
>> packets in a compound RTCP message, but at several places there
>> are no checks to see if the pointer has advanced beyond the last
>> packet and the code starts to access random memory.
>>
>> Attached you find my patch on file control.cpp for the problem.
>>
>> It seems I have just been 'lucky' that the bug did not hit me
>> before. Though I think I might have seen it before, but could never
>> reproduce it so often as I can now (it only hits me on one of my
>> PC's. On another PC it never shows up).
>>
>> I had planned to release a version of my softphone tomorrow (if the
>> rest of my testing goes well :-) ). To release my softphone,
>> I would need to publish my private version of ccRTP with this patch
>> to avoid the segmentation faults. I prefer to rely on an
>> official release of ccRTP though.
>>
>> When do you plan to release a next release of ccRTP including this
>> fix?
>>
>> Best regards,
>> Michel
>>
>>
>> ------------------------------------------------------------------------
>>
>> --- ccrtp-1.3.2/src/control.cpp    2005-05-02 19:27:04.000000000 +0200
>> +++ ccrtp-1.3.2b/src/control.cpp    2005-07-23 14:40:48.530213224 +0200
>> @@ -334,7 +334,7 @@
>>      }
>>  
>>      // Process all RR reports.
>> -    while ( (RTCPPacket::tRR == pkt->fh.type) ) {
>> +    while ( pointer < len && (RTCPPacket::tRR == pkt->fh.type) ) {
>>          sourceLink = getSourceBySSRC(pkt->getSSRC(),
>>                           source_created);
>>          if ( checkSSRCInRTCPPkt(*sourceLink,source_created,
>> @@ -348,7 +348,8 @@
>>      // SDES, APP and BYE. process first everything but the
>>      // BYE packets.
>>      bool cname_found = false;
>> -    while ( (pkt->fh.type == RTCPPacket::tSDES ||
>> +    while ( pointer < len &&
>> +        (pkt->fh.type == RTCPPacket::tSDES ||
>>           pkt->fh.type == RTCPPacket::tAPP) ) {
>>          I ( cname_found || !pkt->fh.padding );
>>          sourceLink = getSourceBySSRC(pkt->getSSRC(),
>> @@ -358,16 +359,15 @@
>>                      transport_port) ) {
>>              if ( pkt->fh.type == RTCPPacket::tSDES ) {
>>                  bool cname = onGotSDES(*s,*pkt);
>> -                pointer += pkt->getLength();
>>                  cname_found = cname_found? cname_found : cname;
>>              } else if ( pkt->fh.type == RTCPPacket::tAPP ) {
>>                  onGotAPP(*s,pkt->info.APP,pkt->getLength());
>> -                pointer += pkt->getLength();
>>              } else {
>>                  // error?
>>              }
>>          }
>>          // Get the next packet in the compound.
>> +        pointer += pkt->getLength();
>>          pkt = reinterpret_cast<RTCPPacket *>(rtcpRecvBuffer +pointer);
>>      }
>>         
>>
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> Ccrtp-devel mailing list
>> [email protected]
>> http://lists.gnu.org/mailman/listinfo/ccrtp-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.