diff --git a/headers/private/net/DynamicBuffer.h b/headers/private/net/DynamicBuffer.h index 854a92ed7e..249b487d0f 100644 --- a/headers/private/net/DynamicBuffer.h +++ b/headers/private/net/DynamicBuffer.h @@ -14,8 +14,10 @@ class DynamicBuffer { public: - DynamicBuffer(size_t initialSize = 0); + DynamicBuffer(size_t initialSize = 1); ~DynamicBuffer(); + + DynamicBuffer(const DynamicBuffer& buffer); // InitCheck() should be called to guarantee the object initialization // didn't fail. If it does not return B_OK, the initialization failed. @@ -47,7 +49,7 @@ public: void PrintToStream(); private: - status_t _GrowToFit(size_t size); + status_t _GrowToFit(size_t size, bool exact = false); unsigned char* fBuffer; size_t fBufferSize; diff --git a/src/kits/network/libnetapi/DynamicBuffer.cpp b/src/kits/network/libnetapi/DynamicBuffer.cpp index d9f148698d..6f96f8088c 100644 --- a/src/kits/network/libnetapi/DynamicBuffer.cpp +++ b/src/kits/network/libnetapi/DynamicBuffer.cpp @@ -8,9 +8,12 @@ #include "DynamicBuffer.h" +#include + #include #include +#include DynamicBuffer::DynamicBuffer(size_t initialSize) : fBuffer(NULL), @@ -38,6 +41,26 @@ DynamicBuffer::~DynamicBuffer() } +DynamicBuffer::DynamicBuffer(const DynamicBuffer& buffer) : + fBuffer(NULL), + fBufferSize(0), + fDataStart(0), + fDataEnd(0), + fInit(B_NO_INIT) +{ + fInit = buffer.fInit; + if (fInit == B_OK) { + status_t result = _GrowToFit(buffer.fBufferSize, true); + if (result == B_OK) { + memcpy(fBuffer, buffer.fBuffer, fBufferSize); + fDataStart = buffer.fDataStart; + fDataEnd = buffer.fDataEnd; + } else + fInit = result; + } +} + + status_t DynamicBuffer::InitCheck() const { @@ -114,12 +137,16 @@ DynamicBuffer::PrintToStream() status_t -DynamicBuffer::_GrowToFit(size_t size) +DynamicBuffer::_GrowToFit(size_t size, bool exact) { if (size <= fBufferSize - fDataEnd) return B_OK; - - size_t newSize = (fBufferSize + size) * 2; + + size_t newSize; + if (!exact) + newSize = (fBufferSize + size) * 2; + else + newSize = size; unsigned char* newBuffer = new (std::nothrow) unsigned char[newSize]; if (newBuffer == NULL)