]> git.cworth.org Git - apitrace/commitdiff
Be robust against premature EOF in more places.
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Sat, 7 May 2011 08:25:50 +0000 (09:25 +0100)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Sat, 7 May 2011 08:26:52 +0000 (09:26 +0100)
trace_parser.cpp
trace_parser.hpp

index a63a31f2b195f2cd12470dcccfd473eb79021b37..104485a5e31201a060a7a717f9925aa3704654a6 100644 (file)
@@ -26,6 +26,7 @@
 
 
 #include <assert.h>
+#include <stdlib.h>
 
 #include <zlib.h>
 
@@ -109,9 +110,8 @@ Call *Parser::parse_call(void) {
             std::cerr << "message: " << read_string() << "\n";
             break;
         default:
-            std::cerr << "error: unknown call detail " << c << "\n";
-            assert(0);
-            /* fallthrough */
+            std::cerr << "error: unknown event " << c << "\n";
+            exit(1);
         case -1:
             return NULL;
         }
@@ -151,15 +151,16 @@ void Parser::parse_enter(void) {
     Call *call = new Call(sig);
     call->no = next_call_no++;
 
-    parse_call_details(call);
-
-    calls.push_back(call);
+    if (parse_call_details(call)) {
+        calls.push_back(call);
+    } else {
+        delete call;
+    }
 }
 
 
 Call *Parser::parse_leave(void) {
     unsigned call_no = read_uint();
-
     Call *call = NULL;
     for (CallList::iterator it = calls.begin(); it != calls.end(); ++it) {
         if ((*it)->no == call_no) {
@@ -168,21 +169,25 @@ Call *Parser::parse_leave(void) {
             break;
         }
     }
-    assert(call);
     if (!call) {
         return NULL;
     }
-    parse_call_details(call);
-    return call;
+
+    if (parse_call_details(call)) {
+        return call;
+    } else {
+        delete call;
+        return NULL;
+    }
 }
 
 
-void Parser::parse_call_details(Call *call) {
+bool Parser::parse_call_details(Call *call) {
     do {
         int c = read_byte();
         switch(c) {
         case Trace::CALL_END:
-            return;
+            return true;
         case Trace::CALL_ARG:
             parse_arg(call);
             break;
@@ -191,10 +196,9 @@ void Parser::parse_call_details(Call *call) {
             break;
         default:
             std::cerr << "error: unknown call detail " << c << "\n";
-            assert(0);
-            /* fallthrough */
+            exit(1);
         case -1:
-            return;
+            return false;
         }
     } while(true);
 }
@@ -244,7 +248,8 @@ Value *Parser::parse_value(void) {
         return parse_opaque();
     default:
         std::cerr << "error: unknown type " << c << "\n";
-        assert(0);
+        exit(1);
+    case -1:
         return NULL;
     }
 }
index 49e89087601b3148cc06ec940f6310290d4349f1..7a88d272d1b7fd50bf59d42bc745f79c72b3ec9e 100644 (file)
@@ -78,7 +78,7 @@ protected:
 
     Call *parse_leave(void);
 
-    void parse_call_details(Call *call);
+    bool parse_call_details(Call *call);
 
     void parse_arg(Call *call);