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)
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;
/* 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;
/* 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
}
}
- 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;