static bool cmd_mail_check_state(struct smtp_server_cmd_ctx *cmd)
{
struct smtp_server_connection *conn = cmd->conn;
+ struct smtp_server_command *command = cmd->cmd;
+
+ if (smtp_server_command_is_replied(command) &&
+ !smtp_server_command_replied_success(command) &&
+ !smtp_server_command_reply_is_forwarded(command))
+ return FALSE;
if (conn->state.trans != NULL) {
smtp_server_reply(cmd, 503, "5.5.0", "MAIL already given");
conn->state.pending_mail_cmds--;
i_assert(smtp_server_command_is_replied(command));
+ i_assert(conn->state.state == SMTP_SERVER_STATE_MAIL_FROM ||
+ !smtp_server_command_replied_success(command));
+
if (!smtp_server_command_replied_success(command)) {
- /* Failure; substitute our own error if predictable */
- if (smtp_server_command_reply_is_forwarded(command))
- (void)cmd_mail_check_state(cmd);
+ /* Failure */
return;
}
static bool cmd_rcpt_check_state(struct smtp_server_cmd_ctx *cmd)
{
struct smtp_server_connection *conn = cmd->conn;
+ struct smtp_server_command *command = cmd->cmd;
struct smtp_server_transaction *trans = conn->state.trans;
+ if (smtp_server_command_is_replied(command) &&
+ !smtp_server_command_replied_success(command) &&
+ !smtp_server_command_reply_is_forwarded(command))
+ return FALSE;
+
if (conn->state.pending_mail_cmds == 0 && trans == NULL) {
smtp_server_reply(cmd,
503, "5.5.0", "MAIL needed first");
i_assert(conn->state.pending_rcpt_cmds > 0);
conn->state.pending_rcpt_cmds--;
- if (conn->state.state < SMTP_SERVER_STATE_RCPT_TO) {
- i_assert(conn->state.state == SMTP_SERVER_STATE_MAIL_FROM);
- smtp_server_connection_set_state(
- conn, SMTP_SERVER_STATE_RCPT_TO,
- smtp_address_encode(data->rcpt->path));
- }
-
i_assert(smtp_server_command_is_replied(command));
+ i_assert(conn->state.state == SMTP_SERVER_STATE_RCPT_TO ||
+ !smtp_server_command_replied_success(command));
+
if (!smtp_server_command_replied_success(command)) {
+ /* Failure */
conn->state.denied_rcpt_cmds++;
-
- /* Failure; substitute our own error if predictable */
- if (smtp_server_command_reply_is_forwarded(command))
- (void)cmd_rcpt_check_state(cmd);
-
smtp_server_recipient_denied(
rcpt, smtp_server_command_get_reply(cmd->cmd, 0));
return;
e_debug(cmd->context.event, "Next to reply");
- return smtp_server_command_call_hooks(
- _cmd, SMTP_SERVER_COMMAND_HOOK_NEXT, TRUE);
+ if (!smtp_server_command_call_hooks(
+ _cmd, SMTP_SERVER_COMMAND_HOOK_NEXT, TRUE))
+ return FALSE;
+
+ smtp_server_command_remove_hooks(cmd, SMTP_SERVER_COMMAND_HOOK_NEXT);
+ return TRUE;
}
void smtp_server_command_ready_to_reply(struct smtp_server_command *cmd)
i_assert(submitted == cmd->replies_submitted);
- smtp_server_command_remove_hooks(cmd, SMTP_SERVER_COMMAND_HOOK_NEXT);
-
/* Limit number of consecutive bad commands */
if (is_bad)
conn->bad_counter++;
return FALSE;
}
- if (cmd->state < SMTP_SERVER_COMMAND_STATE_READY_TO_REPLY) {
- (void)smtp_server_command_next_to_reply(&cmd);
+ if (!smtp_server_command_next_to_reply(&cmd))
+ return FALSE;
+ if (cmd->state < SMTP_SERVER_COMMAND_STATE_READY_TO_REPLY)
return FALSE;
- }
i_assert(cmd->state == SMTP_SERVER_COMMAND_STATE_READY_TO_REPLY &&
array_is_created(&cmd->replies));