]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
* Try to fix reading a line from user (using pools)
authorVsevolod Stakhov <vsevolod@rambler-co.ru>
Fri, 6 Feb 2009 17:04:54 +0000 (20:04 +0300)
committerVsevolod Stakhov <vsevolod@rambler-co.ru>
Fri, 6 Feb 2009 17:04:54 +0000 (20:04 +0300)
src/controller.c
src/util.c
src/util.h
src/worker.c

index 104b8d7cab5a40974d8149a67ec8fd7dd415ceb1..d49a68b47cd91e4c5885430bc0581909b53dbd2f 100644 (file)
@@ -368,7 +368,7 @@ read_socket (struct bufferevent *bev, void *arg)
 
        switch (session->state) {
                case STATE_COMMAND:
-                       s = evbuffer_readline (EVBUFFER_INPUT (bev));
+                       s = buffer_readline (session->session_pool, EVBUFFER_INPUT (bev));
                        msg_debug ("read_socket: got '%s' string from user", s);
                        if (s != NULL && *s != 0) {
                                len = strlen (s);
@@ -412,9 +412,6 @@ read_socket (struct bufferevent *bev, void *arg)
             else {
                                bufferevent_enable (bev, EV_WRITE);
             }
-                       if (s != NULL) {
-                               free (s);
-                       }
                        break;
                case STATE_LEARN:
                        i = bufferevent_read (bev, session->learn_buf->pos, session->learn_buf->free);
index 9444592cf2542de71045aab5b3bb624a019171ab..0cda8a8c847b523a0150155d051e90e300778689 100644 (file)
@@ -893,6 +893,51 @@ resolve_stat_filename (memory_pool_t *pool, char *pattern, char *rcpt, char *fro
        return new;
 }
 
+/*
+ * These functions are from libevent where they are static and not exported anywhere
+ * XXX: think how to avoid this
+ */
+
+char *
+buffer_readline (memory_pool_t *pool, struct evbuffer *buf)
+{
+       u_char *data = EVBUFFER_DATA (buf);
+       size_t len = EVBUFFER_LENGTH (buf);
+       char *line, fch, sch;
+       unsigned int i;
+
+       for (i = 0; i < len; i++) {
+               if (data[i] == '\r' || data[i] == '\n') {
+                       break;
+               }
+       }
+
+       if (i == len) {
+               return (NULL);
+       }
+       
+       line = memory_pool_alloc (pool, i + 1);
+
+       memcpy (line, data, i);
+       line[i] = '\0';
+
+       /*
+        * Some protocols terminate a line with '\r\n', so check for
+        * that, too.
+        */
+       if ( i < len - 1 ) {
+               fch = data[i], sch = data[i+1];
+
+               /* Drain one more character if needed */
+               if ( (sch == '\r' || sch == '\n') && sch != fch )
+                       i += 1;
+       }
+
+       evbuffer_drain (buf, i + 1);
+
+       return (line);
+}
+
 /*
  * vi:ts=4
  */
index c0fb77eeb31d6b5e11f2901f74dc79aa0a2b1ad6..3036d37fd0483a04ae781f3194d5a14a62483af4 100644 (file)
@@ -66,5 +66,8 @@ void file_log_function (const gchar *log_domain, GLogLevelFlags log_level, const
 /* Replace %r with rcpt value and %f with from value, new string is allocated in pool */
 char* resolve_stat_filename (memory_pool_t *pool, char *pattern, char *rcpt, char *from);
 
+/* Replace libevent evbuffer_readline with memory_pool variant */
+char* buffer_readline (memory_pool_t *pool, struct evbuffer *buf);
+
 
 #endif
index 2cd7a05ffe5e3293791657f86794e04e968b39d4..7e6699c9302633eff8c23e3dbbf8917bd9be8002 100644 (file)
@@ -128,7 +128,11 @@ read_socket (struct bufferevent *bev, void *arg)
        switch (task->state) {
                case READ_COMMAND:
                case READ_HEADER:
-                       s = evbuffer_readline (EVBUFFER_INPUT (bev));
+                       s = buffer_readline (task->task_pool, EVBUFFER_INPUT (bev));
+                       if (s == NULL) {
+                               msg_debug ("read_socket: got incomplete line from user");
+                               return;
+                       }
                        if (read_rspamd_input_line (task, s) != 0) {
                                task->last_error = "Read error";
                                task->error_code = RSPAMD_NETWORK_ERROR;
@@ -138,7 +142,6 @@ read_socket (struct bufferevent *bev, void *arg)
                                bufferevent_enable (bev, EV_WRITE);
                                bufferevent_disable (bev, EV_READ);
                        }
-                       free (s);
                        break;
                case READ_MESSAGE:
                        r = bufferevent_read (bev, task->msg->pos, task->msg->free);