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 ea9f41d..578bed7 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 @@
return len;
}
+// note caller is responsible for freeing returned events
eventInfo* TFileTransport::readEvent() {
int readTries = 0;
@@ -763,7 +765,13 @@
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<eventInfo> 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 5117b6e..7a6984a 100644
--- a/lib/cpp/src/transport/TFileTransport.h
+++ b/lib/cpp/src/transport/TFileTransport.h
@@ -29,6 +29,7 @@
#include <pthread.h>
+#include <boost/scoped_ptr.hpp>
#include <boost/shared_ptr.hpp>
namespace apache { namespace thrift { namespace transport {