if ( !pg->mpse[pmd->pm_type] )
{
- ParseError("Failed to create pattern matcher for %d\n", pmd->pm_type);
+ ParseError("Failed to create pattern matcher for %d", pmd->pm_type);
return -1;
}
mpse_count++;
if ( !pg )
{
- ParseError("*** failed to create and find a port group for '%s'\n",srvc);
+ ParseError("*** failed to create and find a port group for '%s'",srvc);
continue;
}
int16_t id = FindProtocolReference(srvc);
if (offset == endp)
{
- ParseError("unable to parse as byte value %s\n", toks[0]);
+ ParseError("unable to parse as byte value %s", toks[0]);
return;
}
// Brackets at the beginning have nothing to modify.
if (bracket_index == *pii)
{
- ParseError("sd_pattern \"%s\" starts with curly brackets which have nothing to modify.\n", *pii);
+ ParseError("sd_pattern \"%s\" starts with curly brackets which have nothing to modify.", *pii);
}
// Check for various error cases. Total up the # of bytes needed in new pattern
(*(bracket_index-1) == '}') &&
(*(bracket_index-2) != '\\') )
{
- ParseError("sd_pattern \"%s\" contains curly brackets which have nothing to modify.\n", *pii);
+ ParseError("sd_pattern \"%s\" contains curly brackets which have nothing to modify.", *pii);
}
// Get the number from inside the brackets
repetitions = strtoul(bracket_index+1, &endptr, 10);
if (*endptr != '}' && *endptr != '\0')
{
- ParseError("sd_pattern \"%s\" contains curly brackets with non-digits inside.\n", *pii);
+ ParseError("sd_pattern \"%s\" contains curly brackets with non-digits inside.", *pii);
}
else if (*endptr == '\0')
{
- ParseError("sd_pattern \"%s\" contains an unterminated curly bracket.\n", *pii);
+ ParseError("sd_pattern \"%s\" contains an unterminated curly bracket.", *pii);
}
// The brackets look OK. Increase the rep count.
OptTreeNode* otn = OptTreeNode_Search(r.gid, r.sid);
if ( !otn )
- ParseError("Unable to find OptTreeNode for %u:%u\n", r.gid, r.sid);
+ ParseError("Unable to find OptTreeNode for %u:%u", r.gid, r.sid);
else
EventManager::add_output(&otn->outputFuncs, this);
void CodecManager::add_plugin(const CodecApi* api)
{
if (!api->ctor)
- ParseError("CodecApi ctor() for Codec %s: ctor() must be implemented\n",
- api->base.name);
+ ParseError("CodecApi ctor() for Codec %s: ctor() must be implemented", api->base.name);
+
if (!api->dtor)
- ParseError("CodecApi ctor() for Codec %s: ctor() must be implemented\n",
- api->base.name);
+ ParseError("CodecApi ctor() for Codec %s: ctor() must be implemented", api->base.name);
CodecApiWrapper wrap;
wrap.api = api;
const CodecApi* const cd_api = wrap.api;
if (codec_id >= s_protocols.size())
- ParseError("A maximum of 256 codecs can be registered\n");
+ ParseError("A maximum of 256 codecs can be registered");
if (cd_api->pinit)
cd_api->pinit();
}
if (!grinder)
- ParseError("Unable to find a Codec with data link type %d\n", daq_dlt);
+ ParseError("Unable to find a Codec with data link type %d", daq_dlt);
if ( s_rand )
rand_close(s_rand);
s_rand = rand_open();
if ( !s_rand )
- ParseError("rand_open() failed.\n");
+ ParseError("rand_open() failed.");
rand_get(s_rand, s_id_pool.data(), s_id_pool.size());
}
if ( !p )
{
- ParseError("unknown logger %s\n", name);
+ ParseError("unknown logger %s", name);
return;
}
{
if ( !work )
{
- ParseError("invalid %s[%d]\n", fqn, idx);
+ ParseError("invalid %s[%d]", fqn, idx);
return true;
}
{
if (strncasecmp(tmp->name, val, equal_ptr - val) == 0)
{
- ParseError("Duplicate variable name: %s.\n", tmp->name);
+ ParseError("Duplicate variable name: %s.", tmp->name);
free(node);
return;
}
{ acsmFree2(obj); }
void set_opt(int) override
- { acsm_enable_dfa(obj); }
+ { obj->enable_dfa(); }
int add_pattern(
SnortConfig*, const uint8_t* P, unsigned m,
const uint8_t* T, int n, MpseMatch match,
void* context, int* current_state) override
{
- return acsmSearchSparseDFA_Banded(obj, T, n, match, context, current_state);
+#if 1
+ return acsm_search_dfa_banded(obj, T, n, match, context, current_state);
+#else
+ if ( obj->dfa_enabled() )
+ return acsm_search_dfa_banded(obj, T, n, match, context, current_state);
+
+ // FIXIT-L banded will crash in get_next_state_nfa()
+ return acsm_search_nfa(obj, T, n, match, context, current_state);
+#endif
}
int print_info() override
void set_opt(int flag) override
{
acsmCompressStates(obj, flag);
- acsm_enable_dfa(obj);
+ obj->enable_dfa();
}
int add_pattern(
const uint8_t* T, int n, MpseMatch match,
void* context, int* current_state) override
{
- return acsmSearchSparseDFA_Full(obj, T, n, match, context, current_state);
+ if ( obj->dfa_enabled() )
+ return acsm_search_dfa_full(obj, T, n, match, context, current_state);
+
+ return acsm_search_nfa(obj, T, n, match, context, current_state);
}
int search_all(
const uint8_t* T, int n, MpseMatch match,
void* context, int* current_state) override
{
- return acsmSearchSparseDFA_Full_All(obj, T, n, match, context, current_state);
+ if ( !obj->dfa_enabled() )
+ return 0; // nfa + all not supported
+
+ return acsm_search_dfa_full_all(obj, T, n, match, context, current_state);
}
int print_info() override
{ if (obj) acsmFree2(obj); }
void set_opt(int) override
- { acsm_enable_dfa(obj); }
+ { obj->enable_dfa(); }
int add_pattern(
SnortConfig*, const uint8_t* P, unsigned m,
const uint8_t* T, int n, MpseMatch match,
void* context, int* current_state) override
{
- return acsmSearchSparseDFA(obj, T, n, match, context, current_state);
+ if ( obj->dfa_enabled() )
+ return acsm_search_dfa_sparse(obj, T, n, match, context, current_state);
+
+ return acsm_search_nfa(obj, T, n, match, context, current_state);
}
int print_info() override
{ acsmFree2(obj); }
void set_opt(int) override
- { acsm_enable_dfa(obj); }
+ { obj->enable_dfa(); }
int add_pattern(
SnortConfig*, const uint8_t* P, unsigned m,
const uint8_t* T, int n, MpseMatch match,
void* context, int* current_state) override
{
- return acsmSearchSparseDFA(obj, T, n, match, context, current_state);
+ if ( obj->dfa_enabled() )
+ return acsm_search_dfa_sparse(obj, T, n, match, context, current_state);
+
+ return acsm_search_nfa(obj, T, n, match, context, current_state);
}
int print_info() override
return p;
}
-void acsm_enable_dfa(ACSM_STRUCT2* acsm)
-{ acsm->dfa = true; }
-
/*
* Add a pattern to the list of patterns for this state machine
*
/*
* Get the NextState from the NFA, all NFA storage formats use this
*/
-static inline acstate_t SparseGetNextStateNFA(acstate_t* ps, acstate_t state, unsigned input)
+static inline acstate_t get_next_state_nfa(acstate_t* ps, acstate_t state, unsigned input)
{
acstate_t fmt;
acstate_t n;
/*
* Get the NextState from the DFA Next State Transition table
* Full and banded are supported separately, this is for
-* sparse and sparse-bands
+* sparse and sparse-bands. But note that for optimization
+* purposes, a given row may be full.
*/
static inline acstate_t SparseGetNextStateDFA(
acstate_t* ps, acstate_t, unsigned input)
switch ( ps[0] )
{
- case ACF_BANDED:
- {
- /* n=ps[2] : number of entries in the band
- index=ps[3] : index of the 1st entry, sequential thereafter */
-
- if ( input < ps[3] )
- return 0;
- if ( input >= (unsigned)(ps[3]+ps[2]) )
- return 0;
-
- return ps[4+input-ps[3]];
- }
-
case ACF_FULL:
{
return ps[2+input];
*
* Sparse & Sparse-Banded Matrix search
*/
-int acsmSearchSparseDFA(
+int acsm_search_dfa_sparse(
ACSM_STRUCT2* acsm, const uint8_t* Tx, int n, MpseMatch match,
void* context, int* current_state)
{
state = ps[2u + sindex]; \
}
-int acsmSearchSparseDFA_Full(
+int acsm_search_dfa_full(
ACSM_STRUCT2* acsm, const uint8_t* Tx, int n, MpseMatch match,
void* context, int* current_state
)
state = ps[2u + sindex]; \
}
-int acsmSearchSparseDFA_Full_All(
+int acsm_search_dfa_full_all(
ACSM_STRUCT2* acsm, const uint8_t* Tx, int n, MpseMatch match,
void* context, int* current_state)
{
* ps[2] = # elements in band
* ps[3] = index of 1st element
*/
-int acsmSearchSparseDFA_Banded(
+int acsm_search_dfa_banded(
ACSM_STRUCT2* acsm, const uint8_t* Tx, int n, MpseMatch match,
void* context, int* current_state)
{
return nfound;
}
-/*
-* Search Text or Binary Data for Pattern matches
-*
-* Sparse Storage Version
-*/
-int acsmSearchSparseNFA(
+// Search Text or Binary Data for Pattern matches
+
+int acsm_search_nfa(
ACSM_STRUCT2* acsm, const uint8_t* Tx, int n, MpseMatch match,
void* context, int* current_state)
{
Tchar = xlatcase[ *T ];
- while ( (nstate=SparseGetNextStateNFA(NextState[state],state,Tchar))==ACSM_FAIL_STATE2 )
+ while ( (nstate=get_next_state_nfa(NextState[state],state,Tchar))==ACSM_FAIL_STATE2 )
state = FailState[state];
state = nstate;
void* context, int* current_state)
{
if ( !acsm->dfa )
- return acsmSearchSparseNFA(acsm, Tx, n, match, context, current_state);
+ return acsm_search_nfa(acsm, Tx, n, match, context, current_state);
switch ( acsm->acsmFormat )
{
case ACF_FULL:
- return acsmSearchSparseDFA_Full(acsm, Tx, n, match, context, current_state);
+ return acsm_search_dfa_full(acsm, Tx, n, match, context, current_state);
case ACF_BANDED:
- return acsmSearchSparseDFA_Banded(acsm, Tx, n, match, context, current_state);
+ return acsm_search_dfa_banded(acsm, Tx, n, match, context, current_state);
case ACF_SPARSE:
case ACF_SPARSE_BANDS:
- return acsmSearchSparseDFA(acsm, Tx, n, match, context, current_state);
+ return acsm_search_dfa_sparse(acsm, Tx, n, match, context, current_state);
}
return 0;
}
-static int acsmSearchAll2(
- ACSM_STRUCT2* acsm, uint8_t* Tx, int n, MpseMatch match,
- void* context, int* current_state)
-{
- if ( acsm->acsmFormat == ACF_FULL )
- return acsmSearchSparseDFA_Full_All(acsm, Tx, n, match, context, current_state);
-
- return acsmSearch2(acsm, Tx, n, match, context, current_state);
-}
-
/*
* Text Data Buffer
*/
int compress_states;
bool dfa;
+
+ void enable_dfa()
+ { dfa = true; }
+
+ bool dfa_enabled()
+ { return dfa; }
};
/*
int acsmCompile2(struct SnortConfig*, ACSM_STRUCT2*);
-int acsmSearchSparseDFA_Full(
+int acsm_search_nfa(
ACSM_STRUCT2*, const uint8_t* T, int n, MpseMatch, void* context, int* current_state);
-int acsmSearchSparseDFA_Banded(
+int acsm_search_dfa_sparse(
ACSM_STRUCT2*, const uint8_t* T, int n, MpseMatch, void* context, int* current_state);
-int acsmSearchSparseDFA(
+int acsm_search_dfa_banded(
ACSM_STRUCT2*, const uint8_t* T, int n, MpseMatch, void* context, int* current_state);
-int acsmSearchSparseNFA(
+int acsm_search_dfa_full(
ACSM_STRUCT2*, const uint8_t* T, int n, MpseMatch, void* context, int* current_state);
-int acsmSearchSparseDFA_Full_All(
+int acsm_search_dfa_full_all(
ACSM_STRUCT2*, const uint8_t* Tx, int n, MpseMatch, void* context, int* current_state);
void acsmFree2(ACSM_STRUCT2*);
int acsmPatternCount2(ACSM_STRUCT2*);
void acsmCompressStates(ACSM_STRUCT2*, int);
-void acsm_enable_dfa(ACSM_STRUCT2*);
void acsmPrintInfo2(ACSM_STRUCT2* p);
/*Only one method is allowed with !*/
if (negated && (++num_tokens > 1))
- ParseError("Only one method is allowed with ! for sip_method\n");
+ ParseError("Only one method is allowed with ! for sip_method");
method = add_sip_method(tok);
if(!method)
{
- ParseError("Failed to add a new method to sip_method\n");
+ ParseError("Failed to add a new method to sip_method");
return false;
}
if ((statCode > MAX_STAT_CODE) || ((statCode > NUM_OF_RESPONSE_TYPES - 1) &&
(statCode < MIN_STAT_CODE)))
{
- ParseError("Status code specified is not a 3 digit number or 1\n");
+ ParseError("Status code specified is not a 3 digit number or 1");
return false;
}
ssod.stat_codes[num_tokens] = (uint16_t)statCode;
if (SIP_AddMethodToList(cur_tokenp,
StandardMethods[i_method].methodFlag, pmethods) == NULL)
{
- ParseError("Failed to add SIP method: %s.\n", cur_tokenp);
+ ParseError("Failed to add SIP method: %s.", cur_tokenp);
}
}
else
{
if (SIP_AddUserDefinedMethod(cur_tokenp, methodsConfig, pmethods) == NULL)
{
- ParseError("Failed to add user defined SIP method: %s.\n", cur_tokenp);
+ ParseError("Failed to add user defined SIP method: %s.", cur_tokenp);
}
}
}
return true;
}
-StreamGlobalConfig::StreamGlobalConfig()
-{
- flags = 0;
- prune_log_max = 1048576;
-}
-
//-------------------------------------------------------------------------
// inspector stuff
//-------------------------------------------------------------------------
#define STREAM_CONFIG_IPS 0x00000400
#define STREAM_CONFIG_NO_ASYNC_REASSEMBLY 0x00000800
-// FIXIT-L some of this stuff can be better encapsulated
-
-struct StreamGlobalConfig
-{
- uint32_t prune_log_max;
- uint32_t flags;
-
- StreamGlobalConfig();
-};
-
-struct StreamConfig
-{
- class FlowControl* fc;
- class Stream* stream;
-
- struct StreamGlobalConfig* global_config;
-};
-
// shared stream state
extern THREAD_LOCAL class FlowControl* flow_con;
extern const PegInfo base_pegs[];
if (fcntl(lock_fd, F_SETLK, &lock) == -1)
{
ClosePidFile();
- ParseError("Failed to Lock PID File \"%s\" for PID \"%d\"\n",
+ ParseError("Failed to Lock PID File \"%s\" for PID \"%d\"",
snort_conf->pid_filename.c_str(), (int)pid);
return;
}
" support unprivileged operation.\n", DAQ_GetType());
else if (setgid(group_id) < 0)
- ParseError("Cannot set gid: %d\n", group_id);
+ ParseError("Cannot set gid: %d", group_id);
else
LogMessage("Set gid to %d\n", group_id);
" support unprivileged operation.\n", DAQ_GetType());
else if (setuid(user_id) < 0)
- ParseError("Can not set uid: %d\n", user_id);
+ ParseError("Can not set uid: %d", user_id);
else
LogMessage("Set uid to %d\n", user_id);
if (fd < 0)
{
- ParseError("can't open %s = %s: %s\n", key, fname, get_error(errno));
+ ParseError("can't open %s = %s: %s", key, fname, get_error(errno));
return nullptr;
}
if (fstat(fd, &buf) < 0)
{
- ParseError("can't stat %s: %s\n", fname, get_error(errno));
+ ParseError("can't stat %s: %s", fname, get_error(errno));
return nullptr;
}
if (cc < 0)
{
- ParseError("read %s: %s\n", fname, get_error(errno));
+ ParseError("read %s: %s", fname, get_error(errno));
free(cp);
return nullptr;
}
if (cc != buf.st_size)
{
- ParseError("short read %s (%d != %d)\n", fname, cc, (int)buf.st_size);
+ ParseError("short read %s (%d != %d)", fname, cc, (int)buf.st_size);
free(cp);
return nullptr;
}
if ( logstore.empty() )
{
- ParseError("Null log directory\n");
+ ParseError("Null log directory");
return;
}
/* change to the directory */
if (chdir(directory.c_str()) != 0)
{
- ParseError("SetChroot: Can not chdir to \"%s\": %s\n", directory.c_str(),
+ ParseError("SetChroot: Can not chdir to \"%s\": %s", directory.c_str(),
get_error(errno));
return;
}
if (absdir == NULL)
{
- ParseError("NULL Chroot found\n");
+ ParseError("NULL Chroot found");
return;
}
/* make the chroot call */
if (chroot(absdir) < 0)
{
- ParseError("Can not chroot to \"%s\": absolute: %s: %s\n",
+ ParseError("Can not chroot to \"%s\": absolute: %s: %s",
directory.c_str(), absdir, get_error(errno));
return;
}
/* change to "/" in the new directory */
if (chdir("/") < 0)
{
- ParseError("Can not chdir to \"/\" after chroot: %s\n",
+ ParseError("Can not chdir to \"/\" after chroot: %s",
get_error(errno));
return;
}