int DetectAppLayerEventPrepare(Signature *s)
{
SigMatch *sm = s->init_data->smlists[g_applayer_events_list_id];
+ SigMatch *smn;
s->init_data->smlists[g_applayer_events_list_id] = NULL;
s->init_data->smlists_tail[g_applayer_events_list_id] = NULL;
while (sm != NULL) {
+ // save it for later use in loop
+ smn = sm->next;
+ /* these will be overwritten in SigMatchAppendSMToList
+ * called by DetectAppLayerEventSetupP2
+ */
sm->next = sm->prev = NULL;
- if (DetectAppLayerEventSetupP2(s, sm) < 0)
+ if (DetectAppLayerEventSetupP2(s, sm) < 0) {
+ // current one was freed, let's free the next ones
+ sm = smn;
+ while(sm) {
+ smn = sm->next;
+ SigMatchFree(sm);
+ sm = smn;
+ }
return -1;
- sm = sm->next;
+ }
+ sm = smn;
}
return 0;