|
|
|
@ -363,6 +363,29 @@ static int SCACGfbsAddPattern(MpmCtx *mpm_ctx, uint8_t *pat, uint16_t patlen,
|
|
|
|
|
/* we need the max pat id */
|
|
|
|
|
if (pid > ctx->max_pat_id)
|
|
|
|
|
ctx->max_pat_id = pid;
|
|
|
|
|
|
|
|
|
|
p->sids_size = 1;
|
|
|
|
|
p->sids = SCMalloc(p->sids_size * sizeof(uint32_t));
|
|
|
|
|
BUG_ON(p->sids == NULL);
|
|
|
|
|
p->sids[0] = sid;
|
|
|
|
|
} else {
|
|
|
|
|
/* TODO figure out how we can be called multiple times for the same CTX with the same sid */
|
|
|
|
|
|
|
|
|
|
int found = 0;
|
|
|
|
|
uint32_t x = 0;
|
|
|
|
|
for (x = 0; x < p->sids_size; x++) {
|
|
|
|
|
if (p->sids[x] == sid) {
|
|
|
|
|
found = 1;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!found) {
|
|
|
|
|
uint32_t *sids = SCRealloc(p->sids, (sizeof(uint32_t) * (p->sids_size + 1)));
|
|
|
|
|
BUG_ON(sids == NULL);
|
|
|
|
|
p->sids = sids;
|
|
|
|
|
p->sids[p->sids_size] = sid;
|
|
|
|
|
p->sids_size++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
@ -1067,6 +1090,10 @@ int SCACGfbsPreparePatterns(MpmCtx *mpm_ctx)
|
|
|
|
|
ctx->parray[i]->original_pat, ctx->parray[i]->len);
|
|
|
|
|
ctx->pid_pat_list[ctx->parray[i]->id].patlen = ctx->parray[i]->len;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ACPatternList now owns this memory */
|
|
|
|
|
ctx->pid_pat_list[ctx->parray[i]->id].sids_size = ctx->parray[i]->sids_size;
|
|
|
|
|
ctx->pid_pat_list[ctx->parray[i]->id].sids = ctx->parray[i]->sids;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* prepare the state table required by AC */
|
|
|
|
@ -1236,6 +1263,8 @@ void SCACGfbsDestroyCtx(MpmCtx *mpm_ctx)
|
|
|
|
|
for (i = 0; i < (ctx->max_pat_id + 1); i++) {
|
|
|
|
|
if (ctx->pid_pat_list[i].cs != NULL)
|
|
|
|
|
SCFree(ctx->pid_pat_list[i].cs);
|
|
|
|
|
if (ctx->pid_pat_list[i].sids != NULL)
|
|
|
|
|
SCFree(ctx->pid_pat_list[i].sids);
|
|
|
|
|
}
|
|
|
|
|
SCFree(ctx->pid_pat_list);
|
|
|
|
|
}
|
|
|
|
@ -1268,6 +1297,9 @@ uint32_t SCACGfbsSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx,
|
|
|
|
|
|
|
|
|
|
SCACGfbsPatternList *pid_pat_list = ctx->pid_pat_list;
|
|
|
|
|
|
|
|
|
|
uint8_t bitarray[pmq->pattern_id_bitarray_size];
|
|
|
|
|
memset(bitarray, 0, pmq->pattern_id_bitarray_size);
|
|
|
|
|
|
|
|
|
|
/* really hate the extra cmp here, but can't help it */
|
|
|
|
|
if (ctx->state_count < 32767) {
|
|
|
|
|
/* \todo Change it for stateful MPM. Supply the state using mpm_thread_ctx */
|
|
|
|
@ -1377,19 +1409,31 @@ uint32_t SCACGfbsSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx,
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (pmq->pattern_id_bitarray[(pids[k] & 0x0000FFFF) / 8] & (1 << ((pids[k] & 0x0000FFFF) % 8))) {
|
|
|
|
|
if (bitarray[(pids[k] & 0x0000FFFF) / 8] & (1 << ((pids[k] & 0x0000FFFF) % 8))) {
|
|
|
|
|
;
|
|
|
|
|
} else {
|
|
|
|
|
bitarray[(pids[k] & 0x0000FFFF) / 8] |= (1 << ((pids[k] & 0x0000FFFF) % 8));
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
uint32_t x;
|
|
|
|
|
for (x = 0; x < pid_pat_list[pids[k] & 0x0000FFFF].sids_size; x++) {
|
|
|
|
|
pmq->rule_id_array[pmq->rule_id_array_cnt++] = pid_pat_list[pids[k] & 0x0000FFFF].sids[x];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
matches++;
|
|
|
|
|
} else {
|
|
|
|
|
if (pmq->pattern_id_bitarray[pids[k] / 8] & (1 << (pids[k] % 8))) {
|
|
|
|
|
if (bitarray[pids[k] / 8] & (1 << (pids[k] % 8))) {
|
|
|
|
|
;
|
|
|
|
|
} else {
|
|
|
|
|
bitarray[pids[k] / 8] |= (1 << (pids[k] % 8));
|
|
|
|
|
pmq->pattern_id_bitarray[pids[k] / 8] |= (1 << (pids[k] % 8));
|
|
|
|
|
pmq->pattern_id_array[pmq->pattern_id_array_cnt++] = pids[k];
|
|
|
|
|
|
|
|
|
|
uint32_t x;
|
|
|
|
|
for (x = 0; x < pid_pat_list[pids[k] & 0x0000FFFF].sids_size; x++) {
|
|
|
|
|
pmq->rule_id_array[pmq->rule_id_array_cnt++] = pid_pat_list[pids[k] & 0x0000FFFF].sids[x];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
matches++;
|
|
|
|
|
}
|
|
|
|
@ -1502,19 +1546,31 @@ uint32_t SCACGfbsSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx,
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (pmq->pattern_id_bitarray[(pids[k] & 0x0000FFFF) / 8] & (1 << ((pids[k] & 0x0000FFFF) % 8))) {
|
|
|
|
|
if (bitarray[(pids[k] & 0x0000FFFF) / 8] & (1 << ((pids[k] & 0x0000FFFF) % 8))) {
|
|
|
|
|
;
|
|
|
|
|
} else {
|
|
|
|
|
bitarray[(pids[k] & 0x0000FFFF) / 8] |= (1 << ((pids[k] & 0x0000FFFF) % 8));
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
uint32_t x;
|
|
|
|
|
for (x = 0; x < pid_pat_list[pids[k] & 0x0000FFFF].sids_size; x++) {
|
|
|
|
|
pmq->rule_id_array[pmq->rule_id_array_cnt++] = pid_pat_list[pids[k] & 0x0000FFFF].sids[x];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
matches++;
|
|
|
|
|
} else {
|
|
|
|
|
if (pmq->pattern_id_bitarray[pids[k] / 8] & (1 << (pids[k] % 8))) {
|
|
|
|
|
if (bitarray[pids[k] / 8] & (1 << (pids[k] % 8))) {
|
|
|
|
|
;
|
|
|
|
|
} else {
|
|
|
|
|
bitarray[pids[k] / 8] |= (1 << (pids[k] % 8));
|
|
|
|
|
pmq->pattern_id_bitarray[pids[k] / 8] |= (1 << (pids[k] % 8));
|
|
|
|
|
pmq->pattern_id_array[pmq->pattern_id_array_cnt++] = pids[k];
|
|
|
|
|
|
|
|
|
|
uint32_t x;
|
|
|
|
|
for (x = 0; x < pid_pat_list[pids[k] & 0x0000FFFF].sids_size; x++) {
|
|
|
|
|
pmq->rule_id_array[pmq->rule_id_array_cnt++] = pid_pat_list[pids[k] & 0x0000FFFF].sids[x];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
matches++;
|
|
|
|
|
}
|
|
|
|
|