diff --git a/src/util-mpm-ac-gfbs.c b/src/util-mpm-ac-gfbs.c index 24648afcfe..789bbd7d8c 100644 --- a/src/util-mpm-ac-gfbs.c +++ b/src/util-mpm-ac-gfbs.c @@ -467,6 +467,12 @@ static void SCACGfbsSetOutputState(int32_t state, uint32_t pid, MpmCtx *mpm_ctx) { SCACGfbsCtx *ctx = (SCACGfbsCtx *)mpm_ctx->ctx; SCACGfbsOutputTable *output_state = &ctx->output_table[state]; + uint32_t i = 0; + + for (i = 0; i < output_state->no_of_entries; i++) { + if (output_state->pids[i] == pid) + return; + } output_state->no_of_entries++; output_state->pids = SCRealloc(output_state->pids, @@ -964,19 +970,28 @@ int SCACGfbsPreparePatterns(MpmCtx *mpm_ctx) for (i = 0; i < mpm_ctx->pattern_cnt; i++) { if (ctx->parray[i]->flags & MPM_PATTERN_FLAG_NOCASE) { - ; + if (ctx->pid_pat_list[ctx->parray[i]->id].case_state == 0) + ctx->pid_pat_list[ctx->parray[i]->id].case_state = 1; + else if (ctx->pid_pat_list[ctx->parray[i]->id].case_state == 1) + ctx->pid_pat_list[ctx->parray[i]->id].case_state = 1; + else + ctx->pid_pat_list[ctx->parray[i]->id].case_state = 3; } else { - if (memcmp(ctx->parray[i]->original_pat, ctx->parray[i]->ci, - ctx->parray[i]->len) != 0) { - ctx->pid_pat_list[ctx->parray[i]->id].cs = SCMalloc(ctx->parray[i]->len); - if (ctx->pid_pat_list[ctx->parray[i]->id].cs == NULL) { - SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory"); - exit(EXIT_FAILURE); - } - memcpy(ctx->pid_pat_list[ctx->parray[i]->id].cs, - ctx->parray[i]->original_pat, ctx->parray[i]->len); - ctx->pid_pat_list[ctx->parray[i]->id].patlen = ctx->parray[i]->len; + ctx->pid_pat_list[ctx->parray[i]->id].cs = SCMalloc(ctx->parray[i]->len); + if (ctx->pid_pat_list[ctx->parray[i]->id].cs == NULL) { + SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory"); + exit(EXIT_FAILURE); } + memcpy(ctx->pid_pat_list[ctx->parray[i]->id].cs, + ctx->parray[i]->original_pat, ctx->parray[i]->len); + ctx->pid_pat_list[ctx->parray[i]->id].patlen = ctx->parray[i]->len; + + if (ctx->pid_pat_list[ctx->parray[i]->id].case_state == 0) + ctx->pid_pat_list[ctx->parray[i]->id].case_state = 2; + else if (ctx->pid_pat_list[ctx->parray[i]->id].case_state == 2) + ctx->pid_pat_list[ctx->parray[i]->id].case_state = 2; + else + ctx->pid_pat_list[ctx->parray[i]->id].case_state = 3; } } @@ -1241,18 +1256,23 @@ uint32_t SCACGfbsSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, uint32_t k = 0; for (k = 0; k < no_of_pid_entries; k++) { if (pids[k] & 0xFFFF0000) { - int ibuf = i; - for (j = pid_pat_list[pids[k] & 0x0000FFFF].patlen - 1; j >= 0; j--, ibuf--) { - if (buf[ibuf] != pid_pat_list[pids[k] & 0x0000FFFF].cs[j]) - goto loop; - } - matches += MpmVerifyMatch(mpm_thread_ctx, pmq, pids[k] & 0x0000FFFF); - } else { - if (pmq == NULL) { - matches++; - continue; + if (SCMemcmp(pid_pat_list[pids[k] & 0x0000FFFF].cs, + buf + i - pid_pat_list[pids[k] & 0x0000FFFF].patlen + 1, + pid_pat_list[pids[k] & 0x0000FFFF].patlen) != 0) { + /* inside loop */ + if (pid_pat_list[pids[k] & 0x0000FFFF].case_state != 3) { + continue; + } } + if (pmq->pattern_id_bitarray[(pids[k] & 0x0000FFFF) / 8] & (1 << ((pids[k] & 0x0000FFFF) % 8))) { + ; + } else { + pmq->pattern_id_bitarray[(pids[k] & 0x0000FFFF) / 8] |= (1 << ((pids[k] & 0x0000FFFF) % 8)); + pmq->pattern_id_array[pmq->pattern_id_array_cnt++] = (pids[k] & 0x0000FFFF); + } + matches++; + } else { if (pmq->pattern_id_bitarray[pids[k] / 8] & (1 << (pids[k] % 8))) { ; } else { @@ -1365,9 +1385,9 @@ uint32_t SCACGfbsSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, buf + i - pid_pat_list[pids[k] & 0x0000FFFF].patlen + 1, pid_pat_list[pids[k] & 0x0000FFFF].patlen) != 0) { /* inside loop */ - //if (pid_pat_list[pids[k] & 0x0000FFFF].case_state != 3) { - //continue; - //} + if (pid_pat_list[pids[k] & 0x0000FFFF].case_state != 3) { + continue; + } continue; } @@ -1489,6 +1509,7 @@ static int SCACGfbsTest01(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -1497,11 +1518,12 @@ static int SCACGfbsTest01(void) /* 1 match */ SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0); + PmqSetup(&pmq, 0, 1); SCACGfbsPreparePatterns(&mpm_ctx); char *buf = "abcdefghjiklmnopqrstuvwxyz"; - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)); if (cnt == 1) @@ -1511,6 +1533,7 @@ static int SCACGfbsTest01(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -1519,6 +1542,7 @@ static int SCACGfbsTest02(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -1527,11 +1551,12 @@ static int SCACGfbsTest02(void) /* 1 match */ SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)"abce", 4, 0, 0, 0, 0, 0); + PmqSetup(&pmq, 0, 1); SCACGfbsPreparePatterns(&mpm_ctx); char *buf = "abcdefghjiklmnopqrstuvwxyz"; - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)); if (cnt == 0) @@ -1541,6 +1566,7 @@ static int SCACGfbsTest02(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -1549,6 +1575,7 @@ static int SCACGfbsTest03(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0x00, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -1561,11 +1588,12 @@ static int SCACGfbsTest03(void) SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)"bcde", 4, 0, 0, 1, 0, 0); /* 1 match */ SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)"fghj", 4, 0, 0, 2, 0, 0); + PmqSetup(&pmq, 0, 3); SCACGfbsPreparePatterns(&mpm_ctx); char *buf = "abcdefghjiklmnopqrstuvwxyz"; - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)); if (cnt == 3) @@ -1575,6 +1603,7 @@ static int SCACGfbsTest03(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -1583,6 +1612,7 @@ static int SCACGfbsTest04(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -1592,11 +1622,12 @@ static int SCACGfbsTest04(void) SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0); SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)"bcdegh", 6, 0, 0, 1, 0, 0); SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)"fghjxyz", 7, 0, 0, 2, 0, 0); + PmqSetup(&pmq, 0, 3); SCACGfbsPreparePatterns(&mpm_ctx); char *buf = "abcdefghjiklmnopqrstuvwxyz"; - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)); if (cnt == 1) @@ -1606,6 +1637,7 @@ static int SCACGfbsTest04(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -1614,6 +1646,7 @@ static int SCACGfbsTest05(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0x00, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -1623,11 +1656,12 @@ static int SCACGfbsTest05(void) SCACGfbsAddPatternCI(&mpm_ctx, (uint8_t *)"ABCD", 4, 0, 0, 0, 0, 0); SCACGfbsAddPatternCI(&mpm_ctx, (uint8_t *)"bCdEfG", 6, 0, 0, 1, 0, 0); SCACGfbsAddPatternCI(&mpm_ctx, (uint8_t *)"fghJikl", 7, 0, 0, 2, 0, 0); + PmqSetup(&pmq, 0, 3); SCACGfbsPreparePatterns(&mpm_ctx); char *buf = "abcdefghjiklmnopqrstuvwxyz"; - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)); if (cnt == 3) @@ -1637,6 +1671,7 @@ static int SCACGfbsTest05(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -1645,6 +1680,7 @@ static int SCACGfbsTest06(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -1652,11 +1688,12 @@ static int SCACGfbsTest06(void) SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0); SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0); + PmqSetup(&pmq, 0, 1); SCACGfbsPreparePatterns(&mpm_ctx); char *buf = "abcd"; - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)); if (cnt == 1) @@ -1666,6 +1703,7 @@ static int SCACGfbsTest06(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -1674,6 +1712,7 @@ static int SCACGfbsTest07(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -1694,11 +1733,12 @@ static int SCACGfbsTest07(void) SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 30, 0, 0, 5, 0, 0); /* total matches: 135 */ + PmqSetup(&pmq, 0, 6); SCACGfbsPreparePatterns(&mpm_ctx); char *buf = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)); if (cnt == 135) @@ -1708,6 +1748,7 @@ static int SCACGfbsTest07(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -1716,6 +1757,7 @@ static int SCACGfbsTest08(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -1724,10 +1766,11 @@ static int SCACGfbsTest08(void) /* 1 match */ SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0); + PmqSetup(&pmq, 0, 1); SCACGfbsPreparePatterns(&mpm_ctx); - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)"a", 1); if (cnt == 0) @@ -1737,6 +1780,7 @@ static int SCACGfbsTest08(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -1745,6 +1789,7 @@ static int SCACGfbsTest09(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -1753,10 +1798,11 @@ static int SCACGfbsTest09(void) /* 1 match */ SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)"ab", 2, 0, 0, 0, 0, 0); + PmqSetup(&pmq, 0, 1); SCACGfbsPreparePatterns(&mpm_ctx); - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)"ab", 2); if (cnt == 1) @@ -1766,6 +1812,7 @@ static int SCACGfbsTest09(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -1774,6 +1821,7 @@ static int SCACGfbsTest10(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -1782,6 +1830,7 @@ static int SCACGfbsTest10(void) /* 1 match */ SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)"abcdefgh", 8, 0, 0, 0, 0, 0); + PmqSetup(&pmq, 0, 1); SCACGfbsPreparePatterns(&mpm_ctx); @@ -1790,7 +1839,7 @@ static int SCACGfbsTest10(void) "abcdefgh" "01234567890123456789012345678901234567890123456789" "01234567890123456789012345678901234567890123456789"; - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)); if (cnt == 1) @@ -1800,6 +1849,7 @@ static int SCACGfbsTest10(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -1808,6 +1858,7 @@ static int SCACGfbsTest11(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -1822,6 +1873,7 @@ static int SCACGfbsTest11(void) goto end; if (SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)"hers", 4, 0, 0, 4, 0, 0) == -1) goto end; + PmqSetup(&pmq, 0, 4); if (SCACGfbsPreparePatterns(&mpm_ctx) == -1) goto end; @@ -1829,21 +1881,22 @@ static int SCACGfbsTest11(void) result = 1; char *buf = "he"; - result &= (SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)buf, + result &= (SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)) == 1); buf = "she"; - result &= (SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)buf, + result &= (SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)) == 2); buf = "his"; - result &= (SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)buf, + result &= (SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)) == 1); buf = "hers"; - result &= (SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)buf, + result &= (SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)) == 2); end: SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -1852,6 +1905,7 @@ static int SCACGfbsTest12(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0x00, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -1862,11 +1916,12 @@ static int SCACGfbsTest12(void) SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)"wxyz", 4, 0, 0, 0, 0, 0); /* 1 match */ SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)"vwxyz", 5, 0, 0, 1, 0, 0); + PmqSetup(&pmq, 0, 2); SCACGfbsPreparePatterns(&mpm_ctx); char *buf = "abcdefghijklmnopqrstuvwxyz"; - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)); if (cnt == 2) @@ -1876,6 +1931,7 @@ static int SCACGfbsTest12(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -1884,6 +1940,7 @@ static int SCACGfbsTest13(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0x00, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -1893,11 +1950,12 @@ static int SCACGfbsTest13(void) /* 1 match */ char *pat = "abcdefghijklmnopqrstuvwxyzABCD"; SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)pat, strlen(pat), 0, 0, 0, 0, 0); + PmqSetup(&pmq, 0, 1); SCACGfbsPreparePatterns(&mpm_ctx); char *buf = "abcdefghijklmnopqrstuvwxyzABCD"; - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)); if (cnt == 1) @@ -1907,6 +1965,7 @@ static int SCACGfbsTest13(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -1915,6 +1974,7 @@ static int SCACGfbsTest14(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0x00, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -1924,11 +1984,12 @@ static int SCACGfbsTest14(void) /* 1 match */ char *pat = "abcdefghijklmnopqrstuvwxyzABCDE"; SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)pat, strlen(pat), 0, 0, 0, 0, 0); + PmqSetup(&pmq, 0, 1); SCACGfbsPreparePatterns(&mpm_ctx); char *buf = "abcdefghijklmnopqrstuvwxyzABCDE"; - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)); if (cnt == 1) @@ -1938,6 +1999,7 @@ static int SCACGfbsTest14(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -1946,6 +2008,7 @@ static int SCACGfbsTest15(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0x00, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -1955,11 +2018,12 @@ static int SCACGfbsTest15(void) /* 1 match */ char *pat = "abcdefghijklmnopqrstuvwxyzABCDEF"; SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)pat, strlen(pat), 0, 0, 0, 0, 0); + PmqSetup(&pmq, 0, 1); SCACGfbsPreparePatterns(&mpm_ctx); char *buf = "abcdefghijklmnopqrstuvwxyzABCDEF"; - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)); if (cnt == 1) @@ -1969,6 +2033,7 @@ static int SCACGfbsTest15(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -1977,6 +2042,7 @@ static int SCACGfbsTest16(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0x00, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -1986,11 +2052,12 @@ static int SCACGfbsTest16(void) /* 1 match */ char *pat = "abcdefghijklmnopqrstuvwxyzABC"; SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)pat, strlen(pat), 0, 0, 0, 0, 0); + PmqSetup(&pmq, 0, 1); SCACGfbsPreparePatterns(&mpm_ctx); char *buf = "abcdefghijklmnopqrstuvwxyzABC"; - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)); if (cnt == 1) @@ -2000,6 +2067,7 @@ static int SCACGfbsTest16(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -2008,6 +2076,7 @@ static int SCACGfbsTest17(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0x00, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -2017,11 +2086,12 @@ static int SCACGfbsTest17(void) /* 1 match */ char *pat = "abcdefghijklmnopqrstuvwxyzAB"; SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)pat, strlen(pat), 0, 0, 0, 0, 0); + PmqSetup(&pmq, 0, 1); SCACGfbsPreparePatterns(&mpm_ctx); char *buf = "abcdefghijklmnopqrstuvwxyzAB"; - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)); if (cnt == 1) @@ -2031,6 +2101,7 @@ static int SCACGfbsTest17(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -2039,6 +2110,7 @@ static int SCACGfbsTest18(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0x00, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -2048,11 +2120,12 @@ static int SCACGfbsTest18(void) /* 1 match */ char *pat = "abcde""fghij""klmno""pqrst""uvwxy""z"; SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)pat, strlen(pat), 0, 0, 0, 0, 0); + PmqSetup(&pmq, 0, 1); SCACGfbsPreparePatterns(&mpm_ctx); char *buf = "abcde""fghij""klmno""pqrst""uvwxy""z"; - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)); if (cnt == 1) @@ -2062,6 +2135,7 @@ static int SCACGfbsTest18(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -2070,6 +2144,7 @@ static int SCACGfbsTest19(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0x00, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -2079,11 +2154,12 @@ static int SCACGfbsTest19(void) /* 1 */ char *pat = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)pat, strlen(pat), 0, 0, 0, 0, 0); + PmqSetup(&pmq, 0, 1); SCACGfbsPreparePatterns(&mpm_ctx); char *buf = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)); if (cnt == 1) @@ -2092,6 +2168,8 @@ static int SCACGfbsTest19(void) printf("1 != %" PRIu32 " ",cnt); SCACGfbsDestroyCtx(&mpm_ctx); + SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -2100,6 +2178,7 @@ static int SCACGfbsTest20(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0x00, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -2109,11 +2188,12 @@ static int SCACGfbsTest20(void) /* 1 */ char *pat = "AAAAA""AAAAA""AAAAA""AAAAA""AAAAA""AAAAA""AA"; SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)pat, strlen(pat), 0, 0, 0, 0, 0); + PmqSetup(&pmq, 0, 1); SCACGfbsPreparePatterns(&mpm_ctx); char *buf = "AAAAA""AAAAA""AAAAA""AAAAA""AAAAA""AAAAA""AA"; - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)); if (cnt == 1) @@ -2123,6 +2203,7 @@ static int SCACGfbsTest20(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -2131,6 +2212,7 @@ static int SCACGfbsTest21(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0x00, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -2139,10 +2221,11 @@ static int SCACGfbsTest21(void) /* 1 */ SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)"AA", 2, 0, 0, 0, 0, 0); + PmqSetup(&pmq, 0, 1); SCACGfbsPreparePatterns(&mpm_ctx); - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)"AA", 2); if (cnt == 1) @@ -2152,6 +2235,7 @@ static int SCACGfbsTest21(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -2160,6 +2244,7 @@ static int SCACGfbsTest22(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0x00, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -2170,11 +2255,12 @@ static int SCACGfbsTest22(void) SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0); /* 1 match */ SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)"abcde", 5, 0, 0, 1, 0, 0); + PmqSetup(&pmq, 0, 2); SCACGfbsPreparePatterns(&mpm_ctx); char *buf = "abcdefghijklmnopqrstuvwxyz"; - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)); if (cnt == 2) @@ -2184,6 +2270,7 @@ static int SCACGfbsTest22(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -2192,6 +2279,7 @@ static int SCACGfbsTest23(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0x00, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -2200,10 +2288,11 @@ static int SCACGfbsTest23(void) /* 1 */ SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)"AA", 2, 0, 0, 0, 0, 0); + PmqSetup(&pmq, 0, 1); SCACGfbsPreparePatterns(&mpm_ctx); - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)"aa", 2); if (cnt == 0) @@ -2213,6 +2302,7 @@ static int SCACGfbsTest23(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -2221,6 +2311,7 @@ static int SCACGfbsTest24(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0x00, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -2229,10 +2320,11 @@ static int SCACGfbsTest24(void) /* 1 */ SCACGfbsAddPatternCI(&mpm_ctx, (uint8_t *)"AA", 2, 0, 0, 0, 0, 0); + PmqSetup(&pmq, 0, 1); SCACGfbsPreparePatterns(&mpm_ctx); - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)"aa", 2); if (cnt == 1) @@ -2242,6 +2334,7 @@ static int SCACGfbsTest24(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -2250,6 +2343,7 @@ static int SCACGfbsTest25(void) int result = 0; MpmCtx mpm_ctx; MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; memset(&mpm_ctx, 0x00, sizeof(MpmCtx)); memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); @@ -2259,11 +2353,12 @@ static int SCACGfbsTest25(void) SCACGfbsAddPatternCI(&mpm_ctx, (uint8_t *)"ABCD", 4, 0, 0, 0, 0, 0); SCACGfbsAddPatternCI(&mpm_ctx, (uint8_t *)"bCdEfG", 6, 0, 0, 1, 0, 0); SCACGfbsAddPatternCI(&mpm_ctx, (uint8_t *)"fghiJkl", 7, 0, 0, 2, 0, 0); + PmqSetup(&pmq, 0, 3); SCACGfbsPreparePatterns(&mpm_ctx); char *buf = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, NULL, + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf, strlen(buf)); if (cnt == 3) @@ -2273,6 +2368,104 @@ static int SCACGfbsTest25(void) SCACGfbsDestroyCtx(&mpm_ctx); SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); + return result; +} + +static int SCACGfbsTest26(void) +{ + int result = 0; + MpmCtx mpm_ctx; + MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; + + memset(&mpm_ctx, 0x00, sizeof(MpmCtx)); + memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); + MpmInitCtx(&mpm_ctx, MPM_AC_GFBS, -1); + SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0); + + SCACGfbsAddPatternCI(&mpm_ctx, (uint8_t *)"Works", 5, 0, 0, 0, 0, 0); + SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)"Works", 5, 0, 0, 1, 0, 0); + PmqSetup(&pmq, 0, 2); + + SCACGfbsPreparePatterns(&mpm_ctx); + + char *buf = "works"; + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, + (uint8_t *)buf, strlen(buf)); + if (cnt == 1) + result = 1; + else + printf("3 != %" PRIu32 " ",cnt); + + SCACGfbsDestroyCtx(&mpm_ctx); + SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); + return result; +} + +static int SCACGfbsTest27(void) +{ + int result = 0; + MpmCtx mpm_ctx; + MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; + + memset(&mpm_ctx, 0, sizeof(MpmCtx)); + memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); + MpmInitCtx(&mpm_ctx, MPM_AC_GFBS, -1); + SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0); + + /* 0 match */ + SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)"ONE", 3, 0, 0, 0, 0, 0); + PmqSetup(&pmq, 0, 1); + + SCACGfbsPreparePatterns(&mpm_ctx); + + char *buf = "tone"; + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, + (uint8_t *)buf, strlen(buf)); + if (cnt == 0) + result = 1; + else + printf("0 != %" PRIu32 " ",cnt); + + SCACGfbsDestroyCtx(&mpm_ctx); + SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); + return result; +} + +static int SCACGfbsTest28(void) +{ + int result = 0; + MpmCtx mpm_ctx; + MpmThreadCtx mpm_thread_ctx; + PatternMatcherQueue pmq; + + memset(&mpm_ctx, 0, sizeof(MpmCtx)); + memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); + MpmInitCtx(&mpm_ctx, MPM_AC_GFBS, -1); + SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0); + + /* 0 match */ + SCACGfbsAddPatternCS(&mpm_ctx, (uint8_t *)"one", 3, 0, 0, 0, 0, 0); + PmqSetup(&pmq, 0, 1); + + SCACGfbsPreparePatterns(&mpm_ctx); + + char *buf = "tONE"; + uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, + (uint8_t *)buf, strlen(buf)); + + if (cnt == 0) + result = 1; + else + printf("0 != %" PRIu32 " ",cnt); + + SCACGfbsDestroyCtx(&mpm_ctx); + SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx); + PmqFree(&pmq); return result; } @@ -2307,6 +2500,9 @@ void SCACGfbsRegisterTests(void) UtRegisterTest("SCACGfbsTest23", SCACGfbsTest23, 1); UtRegisterTest("SCACGfbsTest24", SCACGfbsTest24, 1); UtRegisterTest("SCACGfbsTest25", SCACGfbsTest25, 1); + UtRegisterTest("SCACGfbsTest26", SCACGfbsTest26, 1); + UtRegisterTest("SCACGfbsTest27", SCACGfbsTest27, 1); + UtRegisterTest("SCACGfbsTest28", SCACGfbsTest28, 1); #endif return; diff --git a/src/util-mpm-ac-gfbs.h b/src/util-mpm-ac-gfbs.h index 3ca0b0db8c..995aa8fab7 100644 --- a/src/util-mpm-ac-gfbs.h +++ b/src/util-mpm-ac-gfbs.h @@ -45,6 +45,7 @@ typedef struct SCACGfbsPattern_ { typedef struct SCACGfbsPatternList_ { uint8_t *cs; uint16_t patlen; + uint16_t case_state; } SCACGfbsPatternList; typedef struct SCACGfbsOutputTable_ {