From: David Reiss Date: Tue, 9 Mar 2010 05:20:19 +0000 (+0000) Subject: cpp: Prevent TFileTransport seekToEnd from leaking memory X-Git-Tag: 0.3.0~72 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=336c29dbbeca40543a028c731be6d5c26aeeb363;p=common%2Fthrift.git cpp: Prevent TFileTransport seekToEnd from leaking memory In seekToEnd we loop on readEvent to skip through the last chunk, but the complete events returned are disowned by readState_ and therefore must be freed by the caller. git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@920687 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/lib/cpp/src/transport/TFileTransport.cpp b/lib/cpp/src/transport/TFileTransport.cpp index ea9f41df..578bed71 100644 --- a/lib/cpp/src/transport/TFileTransport.cpp +++ b/lib/cpp/src/transport/TFileTransport.cpp @@ -43,6 +43,7 @@ namespace apache { namespace thrift { namespace transport { +using boost::scoped_ptr; using boost::shared_ptr; using namespace std; using namespace apache::thrift::protocol; @@ -529,6 +530,7 @@ uint32_t TFileTransport::read(uint8_t* buf, uint32_t len) { return len; } +// note caller is responsible for freeing returned events eventInfo* TFileTransport::readEvent() { int readTries = 0; @@ -763,7 +765,13 @@ void TFileTransport::seekToChunk(int32_t chunk) { uint32_t oldReadTimeout = getReadTimeout(); setReadTimeout(NO_TAIL_READ_TIMEOUT); // keep on reading unti the last event at point of seekChunk call - while (readEvent() && ((offset_ + readState_.bufferPtr_) < minEndOffset)) {}; + boost::scoped_ptr event; + while ((offset_ + readState_.bufferPtr_) < minEndOffset) { + event.reset(readEvent()); + if (event.get() == NULL) { + break; + } + } setReadTimeout(oldReadTimeout); } diff --git a/lib/cpp/src/transport/TFileTransport.h b/lib/cpp/src/transport/TFileTransport.h index 5117b6ef..7a6984a8 100644 --- a/lib/cpp/src/transport/TFileTransport.h +++ b/lib/cpp/src/transport/TFileTransport.h @@ -29,6 +29,7 @@ #include +#include #include namespace apache { namespace thrift { namespace transport {