From 336c29dbbeca40543a028c731be6d5c26aeeb363 Mon Sep 17 00:00:00 2001 From: David Reiss Date: Tue, 9 Mar 2010 05:20:19 +0000 Subject: [PATCH] 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 --- lib/cpp/src/transport/TFileTransport.cpp | 10 +++++++++- lib/cpp/src/transport/TFileTransport.h | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) 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 { -- 2.17.1