while (gv != NULL) {
if (gv->type == DETECT_FLOWBITS) {
FlowBit *fb = (FlowBit *) gv;
- char *name = VariableIdxGetName(fb->idx, fb->type);
- if (name != NULL) {
- MemBufferWriteString(aft->buffer, "FLOWBIT: %s\n",
- name);
- SCFree(name);
- }
+ MemBufferWriteString(aft->buffer, "FLOWBIT idx(%"PRIu32")\n", fb->idx);
}
gv = gv->next;
}
DetectPortSpHashInit(de_ctx);
DetectPortDpHashInit(de_ctx);
ThresholdHashInit(de_ctx);
- VariableNameInitHash();
+ VariableNameInitHash(de_ctx);
DetectParseDupSigHashInit(de_ctx);
de_ctx->mpm_pattern_id_store = MpmPatternIdTableInitHash();
ThresholdContextDestroy(de_ctx);
SigCleanSignatures(de_ctx);
- VariableNameFreeHash();
+ VariableNameFreeHash(de_ctx);
if (de_ctx->sig_array)
SCFree(de_ctx->sig_array);
if (cd == NULL)
goto error;
- cd->idx = VariableNameGetIdx(fb_name,DETECT_FLOWBITS);
+ cd->idx = VariableNameGetIdx(de_ctx, fb_name, DETECT_FLOWBITS);
cd->cmd = fb_cmd;
SCLogDebug("idx %" PRIu32 ", cmd %s, name %s",
s = de_ctx->sig_list = SigInit(de_ctx,"alert ip any any -> any any (msg:\"isset option\"; flowbits:isset,fbt; content:\"GET \"; sid:1;)");
- idx = VariableNameGetIdx("fbt",DETECT_FLOWBITS);
+ idx = VariableNameGetIdx(de_ctx, "fbt", DETECT_FLOWBITS);
if (s == NULL || idx != 1) {
goto end;
SigMatchSignatures(&th_v, de_ctx, det_ctx, p);
- idx = VariableNameGetIdx("myflow",DETECT_FLOWBITS);
+ idx = VariableNameGetIdx(de_ctx, "myflow", DETECT_FLOWBITS);
gv = p->flow->flowvar;
SigMatchSignatures(&th_v, de_ctx, det_ctx, p);
- idx = VariableNameGetIdx("myflow",DETECT_FLOWBITS);
+ idx = VariableNameGetIdx(de_ctx, "myflow", DETECT_FLOWBITS);
gv = p->flow->flowvar;
SigMatchSignatures(&th_v, de_ctx, det_ctx, p);
- idx = VariableNameGetIdx("myflow",DETECT_FLOWBITS);
+ idx = VariableNameGetIdx(de_ctx, "myflow", DETECT_FLOWBITS);
gv = p->flow->flowvar;
* return zero(not match).
*/
if (sfd->targettype == FLOWINT_TARGET_VAR) {
- sfd->target.tvar.idx = VariableNameGetIdx(sfd->target.tvar.name, DETECT_FLOWINT);
+ sfd->target.tvar.idx = VariableNameGetIdx(det_ctx->de_ctx, sfd->target.tvar.name, DETECT_FLOWINT);
fvt = FlowVarGet(p->flow, sfd->target.tvar.idx);
/* We don't have that variable initialized yet */
/* Set the name of the origin var to modify/compared with the target */
sfd->name = SCStrdup(varname);
if (de_ctx != NULL)
- sfd->idx = VariableNameGetIdx(varname, DETECT_FLOWINT);
+ sfd->idx = VariableNameGetIdx(de_ctx, varname, DETECT_FLOWINT);
sfd->target.value =(uint32_t) value_long;
sfd->modifier = modifier;
}
cd->name = SCStrdup(varname);
- cd->idx = VariableNameGetIdx(varname,DETECT_FLOWVAR);
+ cd->idx = VariableNameGetIdx(de_ctx, varname, DETECT_FLOWVAR);
memcpy(cd->content, str, len);
cd->content_len = len;
cd->flags = 0;
}
if (capture_str_ptr != NULL) {
if (pd->flags & DETECT_PCRE_CAPTURE_PKT)
- pd->capidx = VariableNameGetIdx((char *)capture_str_ptr,DETECT_PKTVAR);
+ pd->capidx = VariableNameGetIdx(de_ctx, (char *)capture_str_ptr, DETECT_PKTVAR);
else if (pd->flags & DETECT_PCRE_CAPTURE_FLOW)
- pd->capidx = VariableNameGetIdx((char *)capture_str_ptr,DETECT_FLOWVAR);
+ pd->capidx = VariableNameGetIdx(de_ctx, (char *)capture_str_ptr, DETECT_FLOWVAR);
}
}
//printf("DetectPcreParseCapture: pd->capname %s\n", pd->capname ? pd->capname : "NULL");
HashListTable *sport_hash_table;
HashListTable *dport_hash_table;
+ HashListTable *variable_names;
+ HashListTable *variable_idxs;
+ uint16_t variable_names_idx;
+
/* hash table used to cull out duplicate sigs */
HashListTable *dup_sig_hash_table;
#include "detect.h"
#include "util-hashlist.h"
-HashListTable *variable_names;
-HashListTable *variable_idxs;
-uint16_t variable_names_idx;
-
/** \brief Name2idx mapping structure for flowbits, flowvars and pktvars. */
typedef struct VariableName_ {
char *name;
* \retval -1 in case of error
* \retval 0 in case of success
*/
-int VariableNameInitHash() {
- variable_names = HashListTableInit(4096, VariableNameHash, VariableNameCompare, VariableNameFree);
- if (variable_names == NULL)
+int VariableNameInitHash(DetectEngineCtx *de_ctx) {
+ de_ctx->variable_names = HashListTableInit(4096, VariableNameHash, VariableNameCompare, VariableNameFree);
+ if (de_ctx->variable_names == NULL)
return -1;
- variable_idxs = HashListTableInit(4096, VariableIdxHash, VariableIdxCompare, NULL);
- if (variable_idxs == NULL)
+ de_ctx->variable_idxs = HashListTableInit(4096, VariableIdxHash, VariableIdxCompare, NULL);
+ if (de_ctx->variable_idxs == NULL)
return -1;
- variable_names_idx = 0;
+ de_ctx->variable_names_idx = 0;
return 0;
}
-void VariableNameFreeHash() {
- if (variable_names != NULL) {
- HashListTableFree(variable_names);
- HashListTableFree(variable_idxs);
- variable_names = NULL;
- variable_idxs = NULL;
+void VariableNameFreeHash(DetectEngineCtx *de_ctx) {
+ if (de_ctx->variable_names != NULL) {
+ HashListTableFree(de_ctx->variable_names);
+ HashListTableFree(de_ctx->variable_idxs);
+ de_ctx->variable_names = NULL;
+ de_ctx->variable_idxs = NULL;
}
+
+ return;
}
/** \brief Get a name idx for a name. If the name is already used reuse the idx.
* \retval 0 in case of error
* \retval _ the idx.
*/
-uint16_t VariableNameGetIdx(char *name, uint8_t type) {
+uint16_t VariableNameGetIdx(DetectEngineCtx *de_ctx, char *name, uint8_t type) {
uint16_t idx = 0;
VariableName *fn = SCMalloc(sizeof(VariableName));
if (fn->name == NULL)
goto error;
- VariableName *lookup_fn = (VariableName *)HashListTableLookup(variable_names, (void *)fn, 0);
+ VariableName *lookup_fn = (VariableName *)HashListTableLookup(de_ctx->variable_names, (void *)fn, 0);
if (lookup_fn == NULL) {
- variable_names_idx++;
+ de_ctx->variable_names_idx++;
- idx = fn->idx = variable_names_idx;
- HashListTableAdd(variable_names, (void *)fn, 0);
- HashListTableAdd(variable_idxs, (void *)fn, 0);
+ idx = fn->idx = de_ctx->variable_names_idx;
+ HashListTableAdd(de_ctx->variable_names, (void *)fn, 0);
+ HashListTableAdd(de_ctx->variable_idxs, (void *)fn, 0);
} else {
idx = lookup_fn->idx;
VariableNameFree(fn);
* \retval NULL in case of error
* \retval name of the variable if successful.
*/
-char *VariableIdxGetName(uint16_t idx, uint8_t type)
+char *VariableIdxGetName(DetectEngineCtx *de_ctx, uint16_t idx, uint8_t type)
{
VariableName *fn = SCMalloc(sizeof(VariableName));
if (fn == NULL)
fn->type = type;
fn->idx = idx;
- VariableName *lookup_fn = (VariableName *)HashListTableLookup(variable_idxs, (void *)fn, 0);
+ VariableName *lookup_fn = (VariableName *)HashListTableLookup(de_ctx->variable_idxs, (void *)fn, 0);
if (lookup_fn != NULL) {
name = SCStrdup(lookup_fn->name);
if (name == NULL)
#ifndef __UTIL_VAR_NAME_H__
#define __UTIL_VAR_NAME_H__
-int VariableNameInitHash();
-void VariableNameFreeHash();
+int VariableNameInitHash(DetectEngineCtx *);
+void VariableNameFreeHash(DetectEngineCtx *);
-uint16_t VariableNameGetIdx(char *, uint8_t);
-char * VariableIdxGetName(uint16_t , uint8_t);
+uint16_t VariableNameGetIdx(DetectEngineCtx *, char *, uint8_t);
+char * VariableIdxGetName(DetectEngineCtx *, uint16_t , uint8_t);
#endif