| < Previous by Date | Date Index | Next by Date > |
| < Previous in Thread | Thread Index | Next in Thread > |
Index: resip/stack/ConnectionBase.cxx =================================================================== --- resip/stack/ConnectionBase.cxx (revision 8120) +++ resip/stack/ConnectionBase.cxx (working copy) @@ -176,16 +176,26 @@ else {// ...but some of the chunk must be shifted into the next one.- size_t size = numUnprocessedChars*3/2; - if (size < ConnectionBase::ChunkSize) + if (numUnprocessedChars >= ConnectionBase::ChunkSize) { - size = ConnectionBase::ChunkSize;+ // .bwc. We have lots of unprocessed chars here; this can be + // caused if we get a really, really large header field value.+ // We can safely reject this, I think. + delete [] mBuffer; + mBuffer = 0; + delete mMessage; + mMessage = 0; + //.jacob. Shouldn't the state also be set here? + delete this; + return; }- char* newBuffer = MsgHeaderScanner::allocateBuffer(size);+ + // ?bwc? Maybe do a slightly larger buffer here?+ char* newBuffer = MsgHeaderScanner::allocateBuffer(ConnectionBase::ChunkSize); memcpy(newBuffer, unprocessedCharPtr, numUnprocessedChars);mBuffer = newBuffer; mBufferPos = numUnprocessedChars; - mBufferSize = size; + mBufferSize = ConnectionBase::ChunkSize; } mConnState = ReadingHeaders; }
Actually, this patch will cause heap corruption, since mMessage has taken ownership of mBuffer. A better one would be:
Index: resip/stack/ConnectionBase.cxx
===================================================================
--- resip/stack/ConnectionBase.cxx (revision 8120)
+++ resip/stack/ConnectionBase.cxx (working copy)
@@ -176,16 +176,25 @@
else
{
// ...but some of the chunk must be shifted into the
next one.
- size_t size = numUnprocessedChars*3/2;
- if (size < ConnectionBase::ChunkSize)
+ if (numUnprocessedChars >= ConnectionBase::ChunkSize)
{
- size = ConnectionBase::ChunkSize;
+ // .bwc. We have lots of unprocessed chars here;
this can be
+ // caused if we get a really, really large header
field value.
+ // We can safely reject this, I think.
+ delete mMessage;
+ mBuffer = 0;
+ mMessage = 0;
+ //.jacob. Shouldn't the state also be set here?
+ delete this;
+ return;
}
- char* newBuffer =
MsgHeaderScanner::allocateBuffer(size);
+ + // ?bwc? Maybe do a slightly larger buffer here?+ char* newBuffer = MsgHeaderScanner::allocateBuffer(ConnectionBase::ChunkSize); memcpy(newBuffer, unprocessedCharPtr, numUnprocessedChars);
mBuffer = newBuffer;
mBufferPos = numUnprocessedChars;
- mBufferSize = size;
+ mBufferSize = ConnectionBase::ChunkSize;
}
mConnState = ReadingHeaders;
}
Best regards,
Byron Campen
Attachment:
smime.p7s
Description: S/MIME cryptographic signature