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 {