detect/parse: initial substate support

pull/15846/head
Victor Julien 3 weeks ago
parent 95365ce05b
commit 59e2c5a40c

@ -1304,11 +1304,12 @@ static int SigParseProtoHookPkt(Signature *s, const char *proto_hook, const char
return 0;
}
static SignatureHook SetAppHook(const AppProto alproto, uint8_t progress)
static SignatureHook SetAppHook(const AppProto alproto, uint8_t sub_state, uint8_t progress)
{
SignatureHook h = {
.type = SIGNATURE_HOOK_TYPE_APP,
.t.app.alproto = alproto,
.t.app.sub_state = sub_state,
.t.app.app_progress = progress,
};
return h;
@ -1317,31 +1318,59 @@ static SignatureHook SetAppHook(const AppProto alproto, uint8_t progress)
/**
* \param proto_hook string of protocol and hook, e.g. dns:request_complete
*/
static int SigParseProtoHookApp(Signature *s, const char *proto_hook, const char *p, const char *h)
static int SigParseProtoHookApp(
Signature *s, const char *proto_hook, const char *p, const char *in_h)
{
char hook[33];
strlcpy(hook, in_h, 33);
const char *h = hook;
const char *t = NULL;
uint8_t sub_state = 0;
bool has_type = strchr(hook, ':') != NULL;
if (has_type) {
char *rem = NULL;
t = strtok_r(hook, ":", &rem);
h = rem;
SCLogDebug("h: '%s' t: '%s'", h, t);
}
if (h == NULL || strlen(h) == 0) {
SCLogError("invalid hook specification '%s'", hook);
return -1;
}
if (t != NULL) {
if (strlen(t) == 0) {
SCLogError("invalid tx type specification '%s'", hook);
return -1;
}
/* TODO handle substate here */
}
SCLogDebug("h:'%s'", h);
if (strcmp(h, "request_started") == 0) {
s->flags |= SIG_FLAG_TOSERVER;
s->init_data->hook =
SetAppHook(s->alproto, 0); // state 0 should be the starting state in each protocol.
s->init_data->hook = SetAppHook(
s->alproto, sub_state, 0); // state 0 should be the starting state in each protocol.
} else if (strcmp(h, "response_started") == 0) {
s->flags |= SIG_FLAG_TOCLIENT;
s->init_data->hook =
SetAppHook(s->alproto, 0); // state 0 should be the starting state in each protocol.
s->init_data->hook = SetAppHook(
s->alproto, sub_state, 0); // state 0 should be the starting state in each protocol.
} else if (strcmp(h, "request_complete") == 0) {
s->flags |= SIG_FLAG_TOSERVER;
s->init_data->hook = SetAppHook(s->alproto,
s->init_data->hook = SetAppHook(s->alproto, sub_state,
AppLayerParserGetStateProgressCompletionStatus(s->alproto, STREAM_TOSERVER));
} else if (strcmp(h, "response_complete") == 0) {
s->flags |= SIG_FLAG_TOCLIENT;
s->init_data->hook = SetAppHook(s->alproto,
s->init_data->hook = SetAppHook(s->alproto, sub_state,
AppLayerParserGetStateProgressCompletionStatus(s->alproto, STREAM_TOCLIENT));
} else {
const int progress_ts = AppLayerParserGetStateIdByName(
IPPROTO_TCP /* TODO */, s->alproto, h, STREAM_TOSERVER);
if (progress_ts >= 0) {
s->flags |= SIG_FLAG_TOSERVER;
s->init_data->hook = SetAppHook(s->alproto, (uint8_t)progress_ts);
s->init_data->hook = SetAppHook(s->alproto, sub_state, progress_ts);
} else {
const int progress_tc = AppLayerParserGetStateIdByName(
IPPROTO_TCP /* TODO */, s->alproto, h, STREAM_TOCLIENT);
@ -1349,7 +1378,7 @@ static int SigParseProtoHookApp(Signature *s, const char *proto_hook, const char
return -1;
}
s->flags |= SIG_FLAG_TOCLIENT;
s->init_data->hook = SetAppHook(s->alproto, (uint8_t)progress_tc);
s->init_data->hook = SetAppHook(s->alproto, sub_state, progress_tc);
}
}

Loading…
Cancel
Save