]> git.cworth.org Git - apitrace/blobdiff - trace_parser.cpp
Make sure that the snappyfile doesn't try to read past the end of file.
[apitrace] / trace_parser.cpp
index d53d62ce9e73258c851d112f4fe764f130138769..44d1786ac207fe2fa576a88c9cfae90339013fdc 100644 (file)
@@ -29,6 +29,7 @@
 #include <stdlib.h>
 
 #include "trace_file.hpp"
+#include "trace_snappyfile.hpp"
 #include "trace_parser.hpp"
 
 
@@ -39,7 +40,7 @@ namespace Trace {
 
 
 Parser::Parser() {
-    file = new Trace::SnappyFile;
+    file = NULL;
     next_call_no = 0;
     version = 0;
 }
@@ -47,11 +48,17 @@ Parser::Parser() {
 
 Parser::~Parser() {
     close();
-    delete file;
 }
 
 
 bool Parser::open(const char *filename) {
+    assert(!file);
+    if (File::isZLibCompressed(filename)) {
+        file = new ZLibFile;
+    } else {
+        file = new SnappyFile;
+    }
+
     if (!file->open(filename, File::Read)) {
         return false;
     }
@@ -77,13 +84,18 @@ deleteAll(Iter begin, Iter end)
 
 template <typename Container>
 inline void
-deleteAll(const Container &c)
+deleteAll(Container &c)
 {
     deleteAll(c.begin(), c.end());
+    c.clear();
 }
 
 void Parser::close(void) {
-    file->close();
+    if (file) {
+        file->close();
+        delete file;
+        file = NULL;
+    }
 
     deleteAll(calls);
     deleteAll(functions);