diff --git a/src/util-mpm-ac-gfbs.c b/src/util-mpm-ac-gfbs.c index 304b5bd02e..af760d10ec 100644 --- a/src/util-mpm-ac-gfbs.c +++ b/src/util-mpm-ac-gfbs.c @@ -869,6 +869,35 @@ static inline void SCACGfbsCreateModGotoTable(MpmCtx *mpm_ctx) return; } +static inline void SCACGfbsClubOutputStatePresenceWithModGotoTable(MpmCtx *mpm_ctx) +{ + SCACGfbsCtx *ctx = (SCACGfbsCtx *)mpm_ctx->ctx; + + int state = 0; + int no_of_entries; + uint32_t *states; + int i; + for (state = 0; state < ctx->state_count; state++) { + no_of_entries = *((uint32_t *)ctx->goto_table_mod_pointers[state]); + if (no_of_entries == 0) + continue; + + if (*((uint32_t *)ctx->goto_table_mod_pointers[state] + 1) != 0) { + *((uint32_t *)ctx->goto_table_mod_pointers[state] + 1) |= (1 << 24); + } + + states = ((uint32_t *)ctx->goto_table_mod_pointers[state] + 2 + no_of_entries); + for (i = 0; i < no_of_entries; i++) { + if (states[i] == 0) + continue; + + states[i] |= (1 << 24); + } + } + + return; +} + static inline void SCACGfbsInsertCaseSensitiveEntriesForPatterns(MpmCtx *mpm_ctx) { SCACGfbsCtx *ctx = (SCACGfbsCtx *)mpm_ctx->ctx; @@ -909,7 +938,7 @@ static inline void SCACGfbsPrepareStateTable(MpmCtx *mpm_ctx) /* create the final state(delta) table */ SCACGfbsCreateModGotoTable(mpm_ctx); /* club the output state presence with transition entries */ - //SCACGfbsClubOutputStatePresenceWithModGotoTable(mpm_ctx); + SCACGfbsClubOutputStatePresenceWithModGotoTable(mpm_ctx); /* club nocase entries */ SCACGfbsInsertCaseSensitiveEntriesForPatterns(mpm_ctx); @@ -1177,7 +1206,6 @@ uint32_t SCACGfbsSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, SCACGfbsCtx *ctx = (SCACGfbsCtx *)mpm_ctx->ctx; int matches = 0; uint8_t buf_local; - int j = 0; SCACGfbsPatternList *pid_pat_list = ctx->pid_pat_list; @@ -1304,23 +1332,24 @@ uint32_t SCACGfbsSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, register int32_t state = 0; for (i = 0; i < buflen; i++) { /* get the goto state transition */ - no_of_entries = *((uint32_t *)goto_table_mod_pointers[state]); + no_of_entries = *((uint32_t *)goto_table_mod_pointers[state & 0x00FFFFFF]); if (no_of_entries == 0) { temp_state = SC_AC_GFBS_FAIL; } else { if (no_of_entries == 1) { - ascii_codes = (uint32_t *)goto_table_mod_pointers[state] + 2; + ascii_codes = (uint32_t *)goto_table_mod_pointers[state & 0x00FFFFFF] + 2; buf_local = u8_tolower(buf[i]); if (buf_local == ascii_codes[0]) temp_state = ((ascii_codes + no_of_entries))[0]; else temp_state = SC_AC_GFBS_FAIL; } else { - ascii_codes = (uint32_t *)goto_table_mod_pointers[state] + 2; buf_local = u8_tolower(buf[i]); if (state == 0) { + ascii_codes = (uint32_t *)goto_table_mod_pointers[state] + 2; temp_state = ((ascii_codes + no_of_entries))[buf_local]; } else { + ascii_codes = (uint32_t *)goto_table_mod_pointers[state & 0x00FFFFFF] + 2; int low = 0; int high = no_of_entries; int mid; @@ -1340,22 +1369,22 @@ uint32_t SCACGfbsSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, } } while (temp_state == SC_AC_GFBS_FAIL) { - state = *((uint32_t *)goto_table_mod_pointers[state] + 1); + state = *((uint32_t *)goto_table_mod_pointers[state & 0x00FFFFFF] + 1); /* get the goto state transition */ - no_of_entries = *((uint32_t *)goto_table_mod_pointers[state]); + no_of_entries = *((uint32_t *)goto_table_mod_pointers[state & 0x00FFFFFF]); if (no_of_entries == 0) { temp_state = SC_AC_GFBS_FAIL; } else { if (no_of_entries == 1) { - ascii_codes = (uint32_t *)goto_table_mod_pointers[state] + 2; + ascii_codes = (uint32_t *)goto_table_mod_pointers[state & 0x00FFFFFF] + 2; buf_local = u8_tolower(buf[i]); if (buf_local == ascii_codes[0]) temp_state = ((ascii_codes + no_of_entries))[0]; else temp_state = SC_AC_GFBS_FAIL; } else { - ascii_codes = (uint32_t *)goto_table_mod_pointers[state] + 2; + ascii_codes = (uint32_t *)goto_table_mod_pointers[state & 0x00FFFFFF] + 2; buf_local = u8_tolower(buf[i]); if (state == 0) { temp_state = ((ascii_codes + no_of_entries))[buf_local]; @@ -1380,9 +1409,9 @@ uint32_t SCACGfbsSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, } /* else - if (no_of_entries[0] == 0) */ } /* while (temp_state == SC_AC_GFBS_FAIL) */ state = temp_state; - if (ctx->output_table[state].no_of_entries != 0) { - uint32_t no_of_pid_entries = ctx->output_table[state].no_of_entries; - uint32_t *pids = ctx->output_table[state].pids; + if (state & 0x01000000) { + uint32_t no_of_pid_entries = ctx->output_table[state & 0x00FFFFFF].no_of_entries; + uint32_t *pids = ctx->output_table[state & 0x00FFFFFF].pids; uint32_t k = 0; for (k = 0; k < no_of_pid_entries; k++) { if (pids[k] & 0xFFFF0000) {