]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
UE-2919: add termination checks around handleReportInternally
authorAlex Coyte <a.coyte@intel.com>
Mon, 7 Mar 2016 03:48:01 +0000 (14:48 +1100)
committerMatthew Barr <matthew.barr@intel.com>
Wed, 20 Apr 2016 03:34:54 +0000 (13:34 +1000)
src/rose/catchup.c
src/rose/catchup.h
src/rose/match.c

index 40327350ce6529b71e14c4648f581fab6811e587..11178675d01d84977972a5b28590a99d611b768c 100644 (file)
@@ -488,7 +488,8 @@ int roseNfaBlastAdaptor(u64a offset, ReportID id, void *context) {
                  offset, id);
 
     if (handleReportInternally(t, scratch, id, offset)) {
-        return MO_CONTINUE_MATCHING;
+        return can_stop_matching(scratch) ? MO_HALT_MATCHING
+                                          : MO_CONTINUE_MATCHING;
     }
 
     updateLastMatchOffset(tctxt, offset);
@@ -626,7 +627,8 @@ int roseNfaAdaptor(u64a offset, ReportID id, void *context) {
 
     const struct RoseEngine *t = scratch->core_info.rose;
     if (handleReportInternally(t, scratch, id, offset)) {
-        return MO_CONTINUE_MATCHING;
+        return can_stop_matching(scratch) ? MO_HALT_MATCHING
+                                          : MO_CONTINUE_MATCHING;
     }
 
     return tctxt->cb(offset, id, scratch);
@@ -905,6 +907,7 @@ hwlmcb_rv_t buildSufPQ(const struct RoseEngine *t, char *state, s64a safe_loc,
 
     hwlmcb_rv_t rv = roseCatchUpMPV(t, report_ok_loc, scratch);
     if (rv != HWLM_CONTINUE_MATCHING) {
+        DEBUG_PRINTF("terminating...\n");
         return rv;
     }
 
@@ -1060,6 +1063,7 @@ hwlmcb_rv_t roseCatchUpAll(s64a loc, struct hs_scratch *scratch) {
     rv = roseCatchUpMPV(t, loc, scratch);
     assert(rv != HWLM_CONTINUE_MATCHING
            || scratch->catchup_pq.qm_size <= t->outfixEndQueue);
+    assert(!can_stop_matching(scratch) || rv == HWLM_TERMINATE_MATCHING);
     return rv;
 }
 
index 910aa8da0e8191d54c7c3155e393b9394cf1d41e..692b184bdb5c54bd917ae8938c2a9333b9815a11 100644 (file)
@@ -105,6 +105,7 @@ hwlmcb_rv_t roseCatchUpMPV(const struct RoseEngine *t, s64a loc,
                            struct hs_scratch *scratch) {
     u64a cur_offset = loc + scratch->core_info.buf_offset;
     assert(cur_offset >= scratch->tctxt.minMatchOffset);
+    assert(!can_stop_matching(scratch));
 
     if (canSkipCatchUpMPV(t, scratch, cur_offset)) {
         updateMinMatchOffsetFromMpv(&scratch->tctxt, cur_offset);
@@ -151,6 +152,7 @@ hwlmcb_rv_t roseCatchUpTo(const struct RoseEngine *t,
            || scratch->tctxt.minMatchOffset == end);
     assert(rv != HWLM_CONTINUE_MATCHING
            || scratch->tctxt.minNonMpvMatchOffset == end);
+    assert(!can_stop_matching(scratch) || rv == HWLM_TERMINATE_MATCHING);
     return rv;
 }
 
index 9ff7db06d5bf4f0e60270c04cbafa8eb7880dd9b..96f090281fbef36fe9efa1459b0618231491307f 100644 (file)
@@ -184,6 +184,7 @@ hwlmcb_rv_t roseHandleChainMatch(const struct RoseEngine *t,
          * be known to be consistent */
         if (ensureMpvQueueFlushed(t, scratch, qi, loc, in_catchup)
             == HWLM_TERMINATE_MATCHING) {
+            DEBUG_PRINTF("terminating...\n");
             return HWLM_TERMINATE_MATCHING;
         }
     }