diff --git a/ChangeLog b/ChangeLog index 503e2c2a..acd489a3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2010-03-05 Tatsuhiro Tsujikawa + + Fixed memory leak in SocketBuffer when _bufq is not empty when + SocketBuffer is deleted. Added BufEntry constructor and deleted + static factory functions. + * src/SocketBuffer.cc + * src/SocketBuffer.h + 2010-03-05 Tatsuhiro Tsujikawa Only execute RequestGroupMan::fillRequestGroupFromReserver() when diff --git a/src/SocketBuffer.cc b/src/SocketBuffer.cc index f996b9fe..dd061f7e 100644 --- a/src/SocketBuffer.cc +++ b/src/SocketBuffer.cc @@ -35,6 +35,7 @@ #include "SocketBuffer.h" #include +#include #include "SocketCore.h" #include "DlAbortEx.h" @@ -46,16 +47,20 @@ namespace aria2 { SocketBuffer::SocketBuffer(const SharedHandle& socket): _socket(socket), _offset(0) {} -SocketBuffer::~SocketBuffer() {} +SocketBuffer::~SocketBuffer() +{ + std::for_each(_bufq.begin(), _bufq.end(), + std::mem_fun_ref(&BufEntry::deleteBuf)); +} void SocketBuffer::pushBytes(unsigned char* bytes, size_t len) { - _bufq.push_back(BufEntry::createBytes(bytes, len)); + _bufq.push_back(BufEntry(bytes, len)); } void SocketBuffer::pushStr(const std::string& data) { - _bufq.push_back(BufEntry::createStr(data)); + _bufq.push_back(BufEntry(data)); } ssize_t SocketBuffer::send() diff --git a/src/SocketBuffer.h b/src/SocketBuffer.h index eb78f67d..51462c8e 100644 --- a/src/SocketBuffer.h +++ b/src/SocketBuffer.h @@ -67,22 +67,11 @@ private: } } - static BufEntry createBytes(unsigned char* bytes, size_t len) - { - BufEntry b; - b.type = TYPE_BYTES; - b.bytes = bytes; - b.bytesLen = len; - return b; - } + BufEntry(unsigned char* bytes, size_t len): + type(TYPE_BYTES), bytes(bytes), bytesLen(len) {} - static BufEntry createStr(const std::string& str) - { - BufEntry b; - b.type = TYPE_STR; - b.str = new std::string(str); - return b; - } + BufEntry(const std::string& str): + type(TYPE_STR), str(new std::string(str)) {} }; SharedHandle _socket;