if (lookup_sgh == NULL) {
SCLogDebug("proto group %d sgh %p is the original", p, sgh_ts[p]);
- SigGroupHeadSetSigCnt(sgh_ts[p], max_idx);
- SigGroupHeadBuildMatchArray(de_ctx, sgh_ts[p], max_idx);
+ SigGroupHeadSetSigCnt(sgh_ts[p], 0);
+ SigGroupHeadBuildMatchArray(de_ctx, sgh_ts[p], 0);
SigGroupHeadHashAdd(de_ctx, sgh_ts[p]);
SigGroupHeadStore(de_ctx, sgh_ts[p]);
if (lookup_sgh == NULL) {
SCLogDebug("proto group %d sgh %p is the original", p, sgh_tc[p]);
- SigGroupHeadSetSigCnt(sgh_tc[p], max_idx);
- SigGroupHeadBuildMatchArray(de_ctx, sgh_tc[p], max_idx);
+ SigGroupHeadSetSigCnt(sgh_tc[p], 0);
+ SigGroupHeadBuildMatchArray(de_ctx, sgh_tc[p], 0);
SigGroupHeadHashAdd(de_ctx, sgh_tc[p]);
SigGroupHeadStore(de_ctx, sgh_tc[p]);
return wl;
}
-int CreateGroupedPortList(DetectEngineCtx *de_ctx, DetectPort *port_list, DetectPort **newhead, uint32_t unique_groups, int (*CompareFunc)(DetectPort *, DetectPort *), uint32_t max_idx);
+int CreateGroupedPortList(DetectEngineCtx *de_ctx, DetectPort *port_list, DetectPort **newhead,
+ uint32_t unique_groups, int (*CompareFunc)(DetectPort *, DetectPort *));
int CreateGroupedPortListCmpCnt(DetectPort *a, DetectPort *b);
static DetectPort *RulesGroupByPorts(DetectEngineCtx *de_ctx, uint8_t ipproto, uint32_t direction)
DetectPort *newlist = NULL;
uint16_t groupmax = (direction == SIG_FLAG_TOCLIENT) ? de_ctx->max_uniq_toclient_groups :
de_ctx->max_uniq_toserver_groups;
- CreateGroupedPortList(de_ctx, list, &newlist, groupmax, CreateGroupedPortListCmpCnt, max_idx);
+ CreateGroupedPortList(de_ctx, list, &newlist, groupmax, CreateGroupedPortListCmpCnt);
list = newlist;
/* step 4: deduplicate the SGH's */
if (lookup_sgh == NULL) {
SCLogDebug("port group %p sgh %p is the original", iter, iter->sh);
- SigGroupHeadSetSigCnt(iter->sh, max_idx);
- SigGroupHeadBuildMatchArray(de_ctx, iter->sh, max_idx);
+ SigGroupHeadSetSigCnt(iter->sh, 0);
+ SigGroupHeadBuildMatchArray(de_ctx, iter->sh, 0);
SigGroupHeadSetProtoAndDirection(iter->sh, ipproto, direction);
SigGroupHeadHashAdd(de_ctx, iter->sh);
SigGroupHeadStore(de_ctx, iter->sh);
* The joingr is meant to be a catch all.
*
*/
-int CreateGroupedPortList(DetectEngineCtx *de_ctx, DetectPort *port_list, DetectPort **newhead, uint32_t unique_groups, int (*CompareFunc)(DetectPort *, DetectPort *), uint32_t max_idx)
+int CreateGroupedPortList(DetectEngineCtx *de_ctx, DetectPort *port_list, DetectPort **newhead,
+ uint32_t unique_groups, int (*CompareFunc)(DetectPort *, DetectPort *))
{
DetectPort *tmplist = NULL, *joingr = NULL;
char insert = 0;
list->next = NULL;
groups++;
-
- SigGroupHeadSetSigCnt(list->sh, max_idx);
+ SigGroupHeadSetSigCnt(list->sh, 0);
/* insert it */
DetectPort *tmpgr = tmplist, *prevtmpgr = NULL;
/* enable the sig in the bitarray */
(*sgh)->init->sig_array[s->num / 8] |= 1 << (s->num % 8);
-
+ (*sgh)->init->max_sig_id = MAX(s->num, (*sgh)->init->max_sig_id);
return 0;
error:
if (src->init->score)
(*dst)->init->score = MAX((*dst)->init->score, src->init->score);
+ if (src->init->max_sig_id)
+ (*dst)->init->max_sig_id = MAX((*dst)->init->max_sig_id, src->init->max_sig_id);
return 0;
error:
void SigGroupHeadSetSigCnt(SigGroupHead *sgh, uint32_t max_idx)
{
uint32_t sig;
-
+ sgh->init->max_sig_id = MAX(max_idx, sgh->init->max_sig_id);
sgh->init->sig_cnt = 0;
- for (sig = 0; sig < max_idx + 1; sig++) {
+ for (sig = 0; sig < sgh->init->max_sig_id + 1; sig++) {
if (sgh->init->sig_array[sig / 8] & (1 << (sig % 8)))
sgh->init->sig_cnt++;
}
return 0;
BUG_ON(sgh->init->match_array != NULL);
+ sgh->init->max_sig_id = MAX(sgh->init->max_sig_id, max_idx);
sgh->init->match_array = SCCalloc(sgh->init->sig_cnt, sizeof(Signature *));
if (sgh->init->match_array == NULL)
return -1;
- for (sig = 0; sig < max_idx + 1; sig++) {
+ for (sig = 0; sig < sgh->init->max_sig_id + 1; sig++) {
if (!(sgh->init->sig_array[(sig / 8)] & (1 << (sig % 8))) )
continue;