[reSIProcate] Bug in Data::append()

Byron Campen bcampen at estacado.net
Wed Mar 22 17:05:17 CST 2006


	Ah, I was looking at the code on head. That bug was probably fixed a  
while ago. There have been a few (that I know of) nasty memory  
corruption bugs that have been fixed since that release. I will echo  
the chorus of "please update to head" that we've been hearing a lot  
these days.

Best regards,
Byron Campen

>
> Byron,
>
> Are you sure? Looks to me like the buffer is mSize in length.  
> Here's the
> relevant parts:
>
> mBuf = new char[mSize + len];
> mSize += len;
> mBuf[mSize] = 0; // Buffer overflow
>
> I'm using the 0.8.0 tarball.
>
> -brian
>
>
>> -----Original Message-----
>> From: Byron Campen [mailto:bcampen at estacado.net]
>> Sent: Wednesday, March 22, 2006 5:45 PM
>> To: Brian Cuthie
>> Cc: resiprocate-devel at list.sipfoundry.org
>> Subject: Re: [reSIProcate] Bug in Data::append()
>>
>> 	Actually, that buffer has size mSize+1, so that null
>> termination is not causing memory corruption. But, your
>> heap-corruption issue is still real, so I ask what version of
>> resiprocate you are using.
>>
>> Best regards,
>> Byron Campen
>>
>>
>>>
>>> Hello,
>>>
>>> I'm new to this list, and to using the Reciprocate stack.
>> However, I
>>> think I found a bug and wanted to hear what people think.
>> I'm sure I'm
>>> doing this wrong, so please don't be shy about helping me
>> understand
>>> the correct procedure.
>>>
>>> Background:
>>>
>>> While testing the stack under Windows, I had problems with a heap
>>> corruption when writing debug log messages using the
>> VSDebugWindow log
>>> type.
>>>
>>> BUG:
>>>
>>> The following code in Data::append() appears to be in
>> error. The NULL
>>> is written past the end of the buffer, and furthermore I
>> think it is
>>> unnecessary, since c_str() adds a NULL.
>>>
>>> Data&
>>> Data::append(const char* str, size_type len) {
>>>    assert(str);
>>>    if (mCapacity < mSize + len)
>>>    {
>>>       // .dlb. pad for future growth?
>>>       resize(((mSize + len +16)*3)/2, true);
>>>    }
>>>    else
>>>    {
>>>       if (mMine == Share)
>>>       {
>>>          char *oldBuf = mBuf;
>>>          mCapacity = mSize + len;
>>>          mBuf = new char[mSize + len];
>>>          memcpy(mBuf, oldBuf, mSize);
>>>          mMine = Take;
>>>       }
>>>    }
>>>
>>>    // could conceivably overlap
>>>    memmove(mBuf + mSize, str, len);
>>>    mSize += len;
>>>    mBuf[mSize] = 0;   // ERROR
>>>
>>>    return *this;
>>> }
>>>
>>> Finally, there appears to be a related bug fix to Data::c_str()
>>> (#5408).
>>> I'm wondering if someone was tracking this same problem and
>> tried to
>>> fix it there, since resize() will copy the buffer anyway,
>> making the
>>> check in c_str() unecessary.
>>>
>>> Cheers,
>>>
>>> Brian
>>>
>>> _______________________________________________
>>> resiprocate-devel mailing list
>>> resiprocate-devel at list.sipfoundry.org
>>> https://list.sipfoundry.org/mailman/listinfo/resiprocate-devel
>>
>>

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2369 bytes
Desc: not available
URL: <http://list.resiprocate.org/pipermail/resiprocate-devel/attachments/20060322/f51bc183/attachment.bin>


More information about the resiprocate-devel mailing list