]> source.dussan.org Git - rspamd.git/commitdiff
* Use pool allocator for temp strings in headers
authorVsevolod Stakhov <vsevolod@rambler-co.ru>
Tue, 24 Mar 2009 10:24:17 +0000 (13:24 +0300)
committerVsevolod Stakhov <vsevolod@rambler-co.ru>
Tue, 24 Mar 2009 10:24:17 +0000 (13:24 +0300)
src/expressions.c
src/message.c
src/message.h
src/plugins/regexp.c

index 46a4f17fecb447f8854576fed16a4b476100800d..a6b6ec9a12c7622d4f15c8d7da900d9212f0ec14 100644 (file)
@@ -597,7 +597,7 @@ rspamd_header_exists (struct worker_task *task, GList *args)
                return FALSE;
        }
 
-       headerlist = message_get_header (task->message, (char *)arg->data);
+       headerlist = message_get_header (task->task_pool, task->message, (char *)arg->data);
        if (headerlist) {
                g_list_free (headerlist);
                return TRUE;
index be470bb659f0cc588f90d5ac65a1f6f4ceacd9b7..fb0473b80280c31ac217826cdee173d80ad635b7 100644 (file)
@@ -580,7 +580,7 @@ enum {
 };
 
 static GList *
-local_message_get_header(GMimeMessage *message, const char *field)
+local_message_get_header(memory_pool_t *pool, GMimeMessage *message, const char *field)
 {
        GList * gret = NULL;
 #ifndef GMIME24
@@ -592,7 +592,7 @@ local_message_get_header(GMimeMessage *message, const char *field)
        h = GMIME_OBJECT(message)->headers->headers;
        while (h) {
                if (h->value && !g_strncasecmp (field, h->name, strlen (field))) {
-                       gret = g_list_prepend(gret, g_strdup (h->value));
+                       gret = g_list_prepend (gret, memory_pool_strdup (pool, h->value));
                }
                h = h->next;
        }
@@ -608,7 +608,7 @@ local_message_get_header(GMimeMessage *message, const char *field)
                while (g_mime_header_iter_is_valid (iter)) {
                        name = g_mime_header_iter_get_name (iter);
                        if (!g_strncasecmp (field, name, strlen (name))) {
-                               gret = g_list_prepend (gret, g_strdup (g_mime_header_iter_get_value (iter)));
+                               gret = g_list_prepend (gret, memory_pool_strdup (pool, g_mime_header_iter_get_value (iter)));
                        }
                        if (!g_mime_header_iter_next (iter)) {
                                break;
@@ -671,7 +671,7 @@ GET_RECIPIENT_TEMPLATE(bcc, GMIME_RECIPIENT_TYPE_BCC)
 /* different declarations for different types of set and get functions */
 typedef const char *(*GetFunc) (GMimeMessage *message);
 typedef InternetAddressList *(*GetRcptFunc) (GMimeMessage *message, const char *type );
-typedef GList *(*GetListFunc) (GMimeMessage *message, const char *type );
+typedef GList *(*GetListFunc) (memory_pool_t *pool, GMimeMessage *message, const char *type );
 typedef void    (*SetFunc) (GMimeMessage *message, const char *value);
 typedef void    (*SetListFunc) (GMimeMessage *message, const char *field, const char *value);
 
@@ -767,7 +767,7 @@ message_set_header (GMimeMessage *message, const char *field, const char *value)
 * You should free the GList list by yourself.
 **/
 GList *
-message_get_header (GMimeMessage *message, const char *field) 
+message_get_header (memory_pool_t *pool, GMimeMessage *message, const char *field) 
 {
        gint            i;
        char *  ret = NULL, *ia_string;
@@ -791,30 +791,31 @@ message_get_header (GMimeMessage *message, const char *field)
                                        while (ia && ia->address) {
 
                                                ia_string = internet_address_to_string ((InternetAddress *)ia->address, FALSE);
-                                               gret = g_list_append (gret, ia_string);
+                                               gret = g_list_prepend (gret, ia_string);
                                                ia = ia->next;
                                        }
 #else
                                        i = internet_address_list_length (ia);
                                        while (i > 0) {
                                                ia_string = internet_address_to_string (internet_address_list_get_address (ia, i), FALSE);
-                                               gret = g_list_append (gret, ia_string);
+                                               gret = g_list_prepend (gret, ia_string);
                                                -- i;
                                        }
 #endif
                                        break;
                                case FUNC_LIST:
-                                       gret = (*(fieldfunc[i].getlistfunc))(message, field);
+                                       gret = (*(fieldfunc[i].getlistfunc))(pool, message, field);
                                        break;
                        }
                        break;
                }                
        }
        if (gret == NULL && ret != NULL) {
-               gret = g_list_prepend (gret, g_strdup (ret));
+               gret = g_list_prepend (gret, memory_pool_strdup (pool, ret));
        }
        if (fieldfunc[i].functype == FUNC_CHARFREEPTR && ret) {
                g_free (ret);
        }
+
        return gret;
 }
index 7a39c03af20d5c6afcc4dcb2f354c0c762431a9f..97b82985a3f71bae3e584e0dbffc2189b009575f 100644 (file)
@@ -45,6 +45,6 @@ int process_learn (struct controller_session *session);
 GByteArray* get_next_text_part (memory_pool_t *pool, GList *parts, GList **cur);
 
 void message_set_header (GMimeMessage *message, const char *field, const char *value);
-GList* message_get_header (GMimeMessage *message, const char *field);
+GList* message_get_header (memory_pool_t *pool, GMimeMessage *message, const char *field);
 
 #endif
index c106ae3e5971fc321c01fa322684d14eb871a216..b1f4b4f15e638509e982bbf66850efbffbf7609d 100644 (file)
@@ -171,7 +171,7 @@ process_regexp (struct rspamd_regexp *re, struct worker_task *task)
                                return 0;
                        }
                        msg_debug ("process_regexp: checking header regexp: %s = /%s/", re->header, re->regexp_text);
-                       headerlist = message_get_header (task->message, re->header);
+                       headerlist = message_get_header (task->task_pool, task->message, re->header);
                        if (headerlist == NULL) {
                                return 0;
                        }
@@ -183,7 +183,7 @@ process_regexp (struct rspamd_regexp *re, struct worker_task *task)
                                }
                                cur = headerlist;
                                while (cur) {
-                                       if (g_regex_match (re->regexp, cur->data, 0, NULL) == TRUE) {
+                                       if (cur->data && g_regex_match (re->regexp, cur->data, 0, NULL) == TRUE) {
                                                return 1;
                                        }
                                        cur = g_list_next (cur);