[LFSC] Fix segfault
authorAndres Notzli <andres.noetzli@gmail.com>
Sun, 26 Mar 2017 21:39:07 +0000 (23:39 +0200)
committerAndres Notzli <andres.noetzli@gmail.com>
Wed, 5 Apr 2017 14:45:40 +0000 (07:45 -0700)
LFSC did not detect when the number of arguments provided to a side
condition did not match the expected number of arguments, which could
lead to out-of-bounds reads and writes. This commit adds a check and
fixes one of the proof rules that provided the wrong number of
arguments.

proofs/lfsc_checker/code.cpp
proofs/signatures/th_bv_bitblast.plf

index ee143a7102c77888a8f00ce23a3dff4a4c01eceb..48ebc5578df2527a1c1a89533e4bb7857f667992 100644 (file)
@@ -1303,7 +1303,9 @@ Expr *run_code(Expr *_e) {
       return tmp;
     }
 
+    assert(hd->getclass() == CEXPR);
     CExpr *prog = (CExpr *)hd;
+    assert(prog->kids[1]->getclass() == CEXPR);
     Expr **cur = ((CExpr *)prog->kids[1])->kids;
     vector<Expr *> old_vals;
     SymExpr *var;
@@ -1331,10 +1333,26 @@ Expr *run_code(Expr *_e) {
     else
     {
       while((var = (SymExpr *)*cur++)) {
+        // Check whether not enough arguments were supplied
+        if (i >= args.size()) {
+          for (size_t i = 0; i < args.size(); i++) {
+             args[i]->dec();
+          }
+          return NULL;
+        }
+
         old_vals.push_back(var->val);
         var->val = args[i++];
       }
 
+      // Check whether too many arguments were supplied
+      if (i < args.size()) {
+        for (size_t i = 0; i < args.size(); i++) {
+           args[i]->dec();
+        }
+        return NULL;
+      }
+
       if (dbg_prog) {
         dbg_prog_indent(cout);
         cout << "[";
@@ -1359,6 +1377,7 @@ Expr *run_code(Expr *_e) {
       cur = ((CExpr *)prog->kids[1])->kids;
       i = 0;
       while((var = (SymExpr *)*cur++)) {
+        assert(i < args.size());
         args[i]->dec();
         var->val = old_vals[i++];
       }
index 2b2fe086888d41834a0512ae7c99ea54a49189a5..109155a21fa6d61c3a61c5d42efa842533316226 100644 (file)
                        (! xb bblt
                        (! rb bblt
                        (! xbb (bblast_term m x xb)
-                       (! c ( ^ (bblast_sextend xb k m) rb)
+                       (! c ( ^ (bblast_sextend xb k) rb)
                            (bblast_term n (sign_extend n k m x) rb))))))))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;