From 289af2ae8c75b554899154cb289147ea8f99e815 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 28 Apr 2017 18:17:37 +0100 Subject: [PATCH] [Minor] Start command parsing implementation (OPTNEG) --- src/libserver/milter.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/libserver/milter.c b/src/libserver/milter.c index 08a700a27..e90d05f3e 100644 --- a/src/libserver/milter.c +++ b/src/libserver/milter.c @@ -121,11 +121,25 @@ rspamd_milter_on_protocol_error (struct rspamd_milter_session *session, g_error_free (err); } +#define READ_INT_32(pos, var) do { \ + memcpy (&(var), (pos), sizeof (var)); \ + (pos) += sizeof (var); \ + (var) = ntohl (var); \ +} while (0) + static gboolean rspamd_milter_process_command (struct rspamd_milter_session *session, struct rspamd_milter_private *priv) { GError *err; + rspamd_fstring_t *buf; + const guchar *pos; + guint cmdlen; + guint32 version, actions, protocol; + + buf = priv->parser.buf; + pos = buf->str + priv->parser.pos; + cmdlen = priv->parser.datalen; switch (priv->parser.cur_cmd) { case RSPAMD_MILTER_CMD_ABORT: @@ -152,6 +166,17 @@ rspamd_milter_process_command (struct rspamd_milter_session *session, case RSPAMD_MILTER_CMD_EOH: break; case RSPAMD_MILTER_CMD_OPTNEG: + if (cmdlen != sizeof (guint32) * 3) { + err = g_error_new (rspamd_milter_quark (), EINVAL, "invalid " + "optneg command"); + rspamd_milter_on_protocol_error (session, priv, err); + + return FALSE; + } + + READ_INT_32 (pos, version); + READ_INT_32 (pos, actions); + READ_INT_32 (pos, protocol); break; case RSPAMD_MILTER_CMD_QUIT: break; -- 2.39.5