]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Start command parsing implementation (OPTNEG)
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 28 Apr 2017 17:17:37 +0000 (18:17 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 28 Apr 2017 17:17:37 +0000 (18:17 +0100)
src/libserver/milter.c

index 08a700a277bab18db5a14b6f6d1f9627d39ab35e..e90d05f3ebdb27edc827d15884aaaba21be3f62e 100644 (file)
@@ -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;