Преглед на файлове

[CritFix] Fix milter commands pipelining

tags/1.7.0
Vsevolod Stakhov преди 6 години
родител
ревизия
4d66a68e45
променени са 2 файла, в които са добавени 37 реда и са изтрити 10 реда
  1. 35
    9
      src/libserver/milter.c
  2. 2
    1
      src/libserver/milter_internal.h

+ 35
- 9
src/libserver/milter.c Целия файл

@@ -644,13 +644,24 @@ rspamd_milter_process_command (struct rspamd_milter_session *session,
version, actions, protocol);
break;
case RSPAMD_MILTER_CMD_QUIT:
msg_debug_milter ("quit command, refcount: %d", session->ref.refcount);
priv->state = RSPAMD_MILTER_WANNA_DIE;
REF_RETAIN (session);
priv->fin_cb (priv->fd, session, priv->ud);
REF_RELEASE (session);
if (priv->out_chain) {
msg_debug_milter ("quit command, refcount: %d, "
"some output buffers left - draining",
session->ref.refcount);

priv->state = RSPAMD_MILTER_WRITE_AND_DIE;
}
else {
msg_debug_milter ("quit command, refcount: %d",
session->ref.refcount);

return FALSE;
priv->state = RSPAMD_MILTER_WANNA_DIE;
REF_RETAIN (session);
priv->fin_cb (priv->fd, session, priv->ud);
REF_RELEASE (session);

return FALSE;
}
break;
case RSPAMD_MILTER_CMD_RCPT:
msg_debug_milter ("rcpt command");
@@ -935,10 +946,25 @@ rspamd_milter_handle_session (struct rspamd_milter_session *session,
return rspamd_milter_consume_input (session, priv);
}
case RSPAMD_MILTER_WRITE_REPLY:
case RSPAMD_MILTER_WRITE_AND_DIE:
if (priv->out_chain == NULL) {
/* We have written everything, so we can read something */
priv->state = RSPAMD_MILTER_READ_MORE;
rspamd_milter_plan_io (session, priv, EV_READ);
if (priv->state == RSPAMD_MILTER_WRITE_AND_DIE) {
/* Finished writing, let's die finally */
msg_debug_milter ("output drained, terminating, refcount: %d",
session->ref.refcount);

/* Session should be destroyed by fin_cb... */
REF_RETAIN (session);
priv->fin_cb (priv->fd, session, priv->ud);
REF_RELEASE (session);

return FALSE;
}
else {
/* We have written everything, so we can read something */
priv->state = RSPAMD_MILTER_READ_MORE;
rspamd_milter_plan_io (session, priv, EV_READ);
}
}
else {
DL_FOREACH_SAFE (priv->out_chain, obuf, obuf_tmp) {

+ 2
- 1
src/libserver/milter_internal.h Целия файл

@@ -48,7 +48,8 @@ struct rspamd_milter_outbuf {
enum rspamd_milter_io_state {
RSPAMD_MILTER_READ_MORE,
RSPAMD_MILTER_WRITE_REPLY,
RSPAMD_MILTER_WANNA_DIE
RSPAMD_MILTER_WANNA_DIE,
RSPAMD_MILTER_WRITE_AND_DIE,
};

struct rspamd_milter_private {

Loading…
Отказ
Запис