diff --git a/src/nfa/gough.c b/src/nfa/gough.c index 42a252e5..c52bca06 100644 --- a/src/nfa/gough.c +++ b/src/nfa/gough.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Intel Corporation + * Copyright (c) 2015-2016, Intel Corporation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -1049,15 +1049,16 @@ char nfaExecGough16_inAccept(const struct NFA *n, ReportID report, } static -void goughCheckEOD(const struct NFA *nfa, u16 s, +char goughCheckEOD(const struct NFA *nfa, u16 s, const struct gough_som_info *som, u64a offset, SomNfaCallback cb, void *ctxt) { const struct mcclellan *m = (const struct mcclellan *)getImplNfa(nfa); const struct mstate_aux *aux = get_aux(m, s); - if (aux->accept_eod) { - doReports(cb, ctxt, m, som, s, offset, 1, NULL, NULL, NULL); + if (!aux->accept_eod) { + return MO_CONTINUE_MATCHING; } + return doReports(cb, ctxt, m, som, s, offset, 1, NULL, NULL, NULL); } char nfaExecGough8_testEOD(const struct NFA *nfa, const char *state, @@ -1065,8 +1066,8 @@ char nfaExecGough8_testEOD(const struct NFA *nfa, const char *state, UNUSED NfaCallback callback, SomNfaCallback som_callback, void *context) { const struct gough_som_info *som = getSomInfoConst(state); - goughCheckEOD(nfa, *(const u8 *)state, som, offset, som_callback, context); - return 0; + return goughCheckEOD(nfa, *(const u8 *)state, som, offset, som_callback, + context); } char nfaExecGough16_testEOD(const struct NFA *nfa, const char *state, @@ -1075,8 +1076,8 @@ char nfaExecGough16_testEOD(const struct NFA *nfa, const char *state, SomNfaCallback som_callback, void *context) { assert(ISALIGNED_N(state, 8)); const struct gough_som_info *som = getSomInfoConst(state); - goughCheckEOD(nfa, *(const u16 *)state, som, offset, som_callback, context); - return 0; + return goughCheckEOD(nfa, *(const u16 *)state, som, offset, som_callback, + context); } char nfaExecGough8_queueInitState(UNUSED const struct NFA *nfa, struct mq *q) { diff --git a/src/nfa/mcclellan.c b/src/nfa/mcclellan.c index 694196e6..ef670a93 100644 --- a/src/nfa/mcclellan.c +++ b/src/nfa/mcclellan.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Intel Corporation + * Copyright (c) 2015-2016, Intel Corporation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -445,14 +445,15 @@ char mcclellanExec8_i_ni(const struct mcclellan *m, u8 *state, const u8 *buf, } static really_inline -void mcclellanCheckEOD(const struct NFA *nfa, u16 s, u64a offset, +char mcclellanCheckEOD(const struct NFA *nfa, u16 s, u64a offset, NfaCallback cb, void *ctxt) { const struct mcclellan *m = getImplNfa(nfa); const struct mstate_aux *aux = get_aux(m, s); - if (aux->accept_eod) { - doComplexReport(cb, ctxt, m, s, offset, 1, NULL, NULL); + if (!aux->accept_eod) { + return MO_CONTINUE_MATCHING; } + return doComplexReport(cb, ctxt, m, s, offset, 1, NULL, NULL); } static really_inline @@ -1053,8 +1054,8 @@ char nfaExecMcClellan8_testEOD(const struct NFA *nfa, const char *state, UNUSED const char *streamState, u64a offset, NfaCallback callback, UNUSED SomNfaCallback som_cb, void *context) { - mcclellanCheckEOD(nfa, *(const u8 *)state, offset, callback, context); - return 0; + return mcclellanCheckEOD(nfa, *(const u8 *)state, offset, callback, + context); } char nfaExecMcClellan16_testEOD(const struct NFA *nfa, const char *state, @@ -1062,8 +1063,8 @@ char nfaExecMcClellan16_testEOD(const struct NFA *nfa, const char *state, u64a offset, NfaCallback callback, UNUSED SomNfaCallback som_cb, void *context) { assert(ISALIGNED_N(state, 2)); - mcclellanCheckEOD(nfa, *(const u16 *)state, offset, callback, context); - return 0; + return mcclellanCheckEOD(nfa, *(const u16 *)state, offset, callback, + context); } char nfaExecMcClellan8_queueInitState(UNUSED const struct NFA *nfa, struct mq *q) { diff --git a/src/nfa/nfa_api.h b/src/nfa/nfa_api.h index 4e31a625..84a5417b 100644 --- a/src/nfa/nfa_api.h +++ b/src/nfa/nfa_api.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Intel Corporation + * Copyright (c) 2015-2016, Intel Corporation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -236,6 +236,9 @@ char nfaBlockExecReverse(const struct NFA *nfa, u64a offset, const u8 *buf, * @param callback the callback to call for each match raised * @param som_cb the callback to call for each match raised (Haig) * @param context context pointer passed to each callback + * + * @return @ref MO_HALT_MATCHING if the user instructed us to halt, otherwise + * @ref MO_CONTINUE_MATCHING. */ char nfaCheckFinalState(const struct NFA *nfa, const char *state, const char *streamState, u64a offset, diff --git a/src/rose/eod.c b/src/rose/eod.c index 1fa2c6dc..93787137 100644 --- a/src/rose/eod.c +++ b/src/rose/eod.c @@ -168,8 +168,12 @@ void roseCheckNfaEod(const struct RoseEngine *t, char *state, nfaExpandState(nfa, fstate, sstate, offset, key); } - nfaCheckFinalState(nfa, fstate, sstate, offset, scratch->tctxt.cb, - scratch->tctxt.cb_som, scratch->tctxt.userCtx); + if (nfaCheckFinalState(nfa, fstate, sstate, offset, scratch->tctxt.cb, + scratch->tctxt.cb_som, + scratch->tctxt.userCtx) == MO_HALT_MATCHING) { + DEBUG_PRINTF("user instructed us to stop\n"); + return; + } } } @@ -213,8 +217,13 @@ void roseCheckEodSuffixes(const struct RoseEngine *t, char *state, u64a offset, * history buffer. */ char rv = nfaQueueExecRose(q->nfa, q, MO_INVALID_IDX); if (rv) { /* nfa is still alive */ - nfaCheckFinalState(nfa, fstate, sstate, offset, scratch->tctxt.cb, - scratch->tctxt.cb_som, scratch->tctxt.userCtx); + if (nfaCheckFinalState(nfa, fstate, sstate, offset, + scratch->tctxt.cb, scratch->tctxt.cb_som, + scratch->tctxt.userCtx) == + MO_HALT_MATCHING) { + DEBUG_PRINTF("user instructed us to stop\n"); + return; + } } } }