}
}
}
+
+ /* Sort the rule list to lets look at pmq.
+ * NOTE due to merging of 'stream' pmqs we *MAY* have duplicate entries */
+ if (det_ctx->pmq.rule_id_array_cnt) {
+ int DoSort(const void *a, const void *b) {
+ uint32_t x = *(uint32_t *)a;
+ uint32_t y = *(uint32_t *)b;
+ return x - y;
+ }
+ qsort(det_ctx->pmq.rule_id_array, det_ctx->pmq.rule_id_array_cnt,
+ sizeof(uint32_t), DoSort);
+ }
}
#ifdef DEBUG
/* 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;
+ //SCLogInfo("MPM added %u:%u", pid, 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++;
+ //SCLogInfo("p->sids_size %u", p->sids_size);
+ //SCLogInfo("MPM added %u:%u (append)", pid, sid);
+ } else {
+ //SCLogInfo("rule %u already part of pid %u", sid, pid);
+ }
}
return 0;
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 */
+ //SCLogInfo("ctx->parray[i]->sids_size %u", ctx->parray[i]->sids_size);
+ 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 */
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);
}
} 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;
+
+ 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 {
} else {
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]].sids_size; x++) {
+ pmq->rule_id_array[pmq->rule_id_array_cnt++] = pid_pat_list[pids[k]].sids[x];
+ }
}
matches++;
}
} 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;
+
+ 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 {
} else {
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]].sids_size; x++) {
+ pmq->rule_id_array[pmq->rule_id_array_cnt++] = pid_pat_list[pids[k]].sids[x];
+ }
}
matches++;
}
SCLogDebug("pmq->pattern_id_array %p, pmq->pattern_id_bitarray %p",
pmq->pattern_id_array, pmq->pattern_id_bitarray);
+
+ pmq->rule_id_array_size = 65536 * sizeof(uint32_t);
+
+ pmq->rule_id_array = SCMalloc(pmq->rule_id_array_size);
+ if (pmq->rule_id_array == NULL) {
+ SCReturnInt(-1);
+ }
+ memset(pmq->rule_id_array, 0, pmq->rule_id_array_size);
+ pmq->rule_id_array_cnt = 0;
+
}
SCReturnInt(0);
}
/** \todo now set merged flag? */
+
+ if (src->rule_id_array && dst->rule_id_array) {
+ for (u = 0; u < src->rule_id_array_cnt; u++) {
+ dst->rule_id_array[dst->rule_id_array_cnt++] = src->rule_id_array[u];
+ }
+ }
}
/** \brief Reset a Pmq for reusage. Meant to be called after a single search.
}
pmq->pattern_id_array_cnt = 0;
*/
+ pmq->rule_id_array_cnt = 0;
}
/** \brief Cleanup a Pmq
pmq->pattern_id_bitarray = NULL;
}
+ if (pmq->rule_id_array != NULL) {
+ SCFree(pmq->rule_id_array);
+ pmq->rule_id_array = NULL;
+ }
+
pmq->pattern_id_array_cnt = 0;
}