Skip to content

Commit

Permalink
detect/smtp: Refactor command check
Browse files Browse the repository at this point in the history
This commit refactors the code that matches reply with command.

Bug: #3677
  • Loading branch information
jlucovsky authored and victorjulien committed Apr 28, 2020
1 parent dc7a991 commit beb45c5
Showing 1 changed file with 12 additions and 10 deletions.
22 changes: 12 additions & 10 deletions src/app-layer-smtp.c
Expand Up @@ -964,6 +964,12 @@ static int SMTPProcessCommandSTARTTLS(SMTPState *state, Flow *f,
return 0;
}

static inline bool IsReplyToCommand(const SMTPState *state, const uint8_t cmd)
{
return (state->cmds_idx < state->cmds_buffer_len &&
state->cmds[state->cmds_idx] == cmd);
}

static int SMTPProcessReply(SMTPState *state, Flow *f,
AppLayerParserState *pstate,
SMTPThreadCtx *td)
Expand Down Expand Up @@ -1034,7 +1040,7 @@ static int SMTPProcessReply(SMTPState *state, Flow *f,

if (state->cmds_cnt == 0) {
/* reply but not a command we have stored, fall through */
} else if (state->cmds[state->cmds_idx] == SMTP_COMMAND_STARTTLS) {
} else if (IsReplyToCommand(state, SMTP_COMMAND_STARTTLS)) {
if (reply_code == SMTP_REPLY_220) {
/* we are entering STARRTTLS data mode */
state->parser_state |= SMTP_PARSER_STATE_COMMAND_DATA_MODE;
Expand All @@ -1044,18 +1050,20 @@ static int SMTPProcessReply(SMTPState *state, Flow *f,
/* decoder event */
SMTPSetEvent(state, SMTP_DECODER_EVENT_TLS_REJECTED);
}
} else if (state->cmds[state->cmds_idx] == SMTP_COMMAND_DATA) {
} else if (IsReplyToCommand(state, SMTP_COMMAND_DATA)) {
if (reply_code == SMTP_REPLY_354) {
/* Next comes the mail for the DATA command in toserver direction */
state->parser_state |= SMTP_PARSER_STATE_COMMAND_DATA_MODE;
} else {
/* decoder event */
SMTPSetEvent(state, SMTP_DECODER_EVENT_DATA_COMMAND_REJECTED);
}
} else if (IsReplyToCommand(state, SMTP_COMMAND_RSET)) {
if (reply_code == SMTP_REPLY_250) {
SMTPTransactionComplete(state);
}
} else {
/* we don't care for any other command for now */
/* check if reply falls in the valid list of replies for SMTP. If not
* decoder event */
}

/* if it is a multi-line reply, we need to move the index only once for all
Expand All @@ -1071,12 +1079,6 @@ static int SMTPProcessReply(SMTPState *state, Flow *f,
}
}

if (state->cmds_idx < state->cmds_buffer_len && state->cmds[state->cmds_idx] == SMTP_COMMAND_RSET) {
if (reply_code == SMTP_REPLY_250) {
SMTPTransactionComplete(state);
}
}

/* if we have matched all the buffered commands, reset the cnt and index */
if (state->cmds_idx == state->cmds_cnt) {
state->cmds_cnt = 0;
Expand Down

0 comments on commit beb45c5

Please sign in to comment.