cpp: Prevent TFileTransport seekToEnd from leaking memory
authorDavid Reiss <dreiss@apache.org>
Tue, 9 Mar 2010 05:20:19 +0000 (05:20 +0000)
committerDavid Reiss <dreiss@apache.org>
Tue, 9 Mar 2010 05:20:19 +0000 (05:20 +0000)
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
lib/cpp/src/transport/TFileTransport.h

index ea9f41d..578bed7 100644 (file)
@@ -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<eventInfo> event;
+    while ((offset_ + readState_.bufferPtr_) < minEndOffset) {
+      event.reset(readEvent());
+      if (event.get() == NULL) {
+        break;
+      }
+    }
     setReadTimeout(oldReadTimeout);
   }
 
index 5117b6e..7a6984a 100644 (file)
@@ -29,6 +29,7 @@
 
 #include <pthread.h>
 
+#include <boost/scoped_ptr.hpp>
 #include <boost/shared_ptr.hpp>
 
 namespace apache { namespace thrift { namespace transport {