You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@orc.apache.org by md...@apache.org on 2018/06/28 03:04:04 UTC

orc git commit: ORC-384: [C++] fix memory leak when loading non-ORC files

Repository: orc
Updated Branches:
  refs/heads/master 61e947c89 -> b11815595


ORC-384: [C++] fix memory leak when loading non-ORC files

Fixes #289

Signed-off-by: Deepak Majeti <md...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/orc/repo
Commit: http://git-wip-us.apache.org/repos/asf/orc/commit/b1181559
Tree: http://git-wip-us.apache.org/repos/asf/orc/tree/b1181559
Diff: http://git-wip-us.apache.org/repos/asf/orc/diff/b1181559

Branch: refs/heads/master
Commit: b11815595f94ed60e0c779deee9b1b80d7f9b953
Parents: 61e947c
Author: Martin Rupp <ma...@sap.com>
Authored: Wed Jun 27 13:56:37 2018 +0200
Committer: Deepak Majeti <md...@apache.org>
Committed: Wed Jun 27 23:03:49 2018 -0400

----------------------------------------------------------------------
 c++/src/Reader.cc | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/orc/blob/b1181559/c++/src/Reader.cc
----------------------------------------------------------------------
diff --git a/c++/src/Reader.cc b/c++/src/Reader.cc
index 776f4d8..0a3fdcd 100644
--- a/c++/src/Reader.cc
+++ b/c++/src/Reader.cc
@@ -863,10 +863,10 @@ namespace orc {
     if (memcmp(magicStart, MAGIC.c_str(), magicLength) != 0) {
       // If there is no magic string at the end, check the beginning.
       // Only files written by Hive 0.11.0 don't have the tail ORC string.
-      char *frontBuffer = new char[magicLength];
-      stream->read(frontBuffer, magicLength, 0);
-      bool foundMatch = memcmp(frontBuffer, MAGIC.c_str(), magicLength) == 0;
-      delete[] frontBuffer;
+      std::unique_ptr<char[]> frontBuffer( new char[magicLength] );
+      stream->read(frontBuffer.get(), magicLength, 0);
+      bool foundMatch = memcmp(frontBuffer.get(), MAGIC.c_str(), magicLength) == 0;
+
       if (!foundMatch) {
         throw ParseError("Not an ORC file");
       }
@@ -936,11 +936,11 @@ namespace orc {
    * @param memoryPool the memory pool to use
    */
   std::unique_ptr<proto::Footer> readFooter(InputStream* stream,
-                                            DataBuffer<char> *&buffer,
+                                            const DataBuffer<char> *buffer,
                                             uint64_t footerOffset,
                                             const proto::PostScript& ps,
                                             MemoryPool& memoryPool) {
-    char *footerPtr = buffer->data() + footerOffset;
+    const char *footerPtr = buffer->data() + footerOffset;
 
     std::unique_ptr<SeekableInputStream> pbStream =
       createDecompressor(convertCompressionKind(ps),
@@ -989,12 +989,12 @@ namespace orc {
       if (readSize < 4) {
         throw ParseError("File size too small");
       }
-      DataBuffer<char> *buffer = new DataBuffer<char>(*contents->pool, readSize);
+      std::unique_ptr<DataBuffer<char>> buffer( new DataBuffer<char>(*contents->pool, readSize) );
       stream->read(buffer->data(), readSize, fileLength - readSize);
 
       postscriptLength = buffer->data()[readSize - 1] & 0xff;
       contents->postscript = REDUNDANT_MOVE(readPostscript(stream.get(),
-        buffer, postscriptLength));
+        buffer.get(), postscriptLength));
       uint64_t footerSize = contents->postscript->footerlength();
       uint64_t tailSize = 1 + postscriptLength + footerSize;
       uint64_t footerOffset;
@@ -1007,9 +1007,8 @@ namespace orc {
         footerOffset = readSize - tailSize;
       }
 
-      contents->footer = REDUNDANT_MOVE(readFooter(stream.get(), buffer,
+      contents->footer = REDUNDANT_MOVE(readFooter(stream.get(), buffer.get(),
         footerOffset, *contents->postscript,  *contents->pool));
-      delete buffer;
     }
     contents->stream = std::move(stream);
     return std::unique_ptr<Reader>(new ReaderImpl(std::move(contents),