]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/sieve/serv_sieve.c
Memleak: free the roomlist of the sieve-queued rooms on exit; other tiny leaks.
[citadel.git] / citadel / modules / sieve / serv_sieve.c
index 4ca061eae79afe883ad94705a018e3f64bc4caee..a8fe4ea38a030f18eab573a8e985e2992b18d045 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * $Id$
- *
  * This module glues libSieve to the Citadel server in order to implement
  * the Sieve mailbox filtering language (RFC 3028).
  *
@@ -51,7 +49,6 @@
 #include "citserver.h"
 #include "support.h"
 #include "config.h"
-#include "policy.h"
 #include "database.h"
 #include "msgbase.h"
 #include "internet_addressing.h"
@@ -322,7 +319,7 @@ int ctdl_vacation(sieve2_context_t *s, void *my)
        }
 
        sprintf(vacamsg_text, 
-               "Content-type: text/plain\n"
+               "Content-type: text/plain charset=utf-8\n"
                "\n"
                "%s\n"
                "\n"
@@ -542,15 +539,10 @@ void sieve_do_msg(long msgnum, void *userdata) {
         * Grab the message headers so we can feed them to libSieve.
         * Use HEADERS_ONLY rather than HEADERS_FAST in order to include second-level headers.
         */
-       CC->redirect_buffer = malloc(SIZ);
-       CC->redirect_len = 0;
-       CC->redirect_alloc = SIZ;
+       CC->redirect_buffer = NewStrBufPlain(NULL, SIZ);
        CtdlOutputPreLoadedMsg(msg, MT_RFC822, HEADERS_ONLY, 0, 1, 0);
-       my.rfc822headers = CC->redirect_buffer;
-       headers_len = CC->redirect_len;
-       CC->redirect_buffer = NULL;
-       CC->redirect_len = 0;
-       CC->redirect_alloc = 0;
+       headers_len = StrLength(CC->redirect_buffer);
+       my.rfc822headers = SmashStrBuf(&CC->redirect_buffer);
 
        /*
         * libSieve clobbers the stack if it encounters badly formed
@@ -1292,6 +1284,25 @@ BAIL:    res = sieve2_free(&sieve2_context);
 
 }
 
+void cleanup_sieve(void)
+{
+        struct RoomProcList *ptr, *ptr2;
+
+       if (msiv_extensions != NULL)
+               free(msiv_extensions);
+       msiv_extensions = NULL;
+
+        begin_critical_section(S_SIEVELIST);
+       ptr=sieve_list;
+       while (ptr != NULL) {
+               ptr2 = ptr->next;
+               free(ptr);
+               ptr = ptr2;
+       }
+        sieve_list = NULL;
+        end_critical_section(S_SIEVELIST);
+}
+
 int serv_sieve_room(struct ctdlroom *room)
 {
        if (!strcasecmp(&room->QRname[11], MAILROOM)) {
@@ -1309,9 +1320,10 @@ CTDL_MODULE_INIT(sieve)
                CtdlRegisterProtoHook(cmd_msiv, "MSIV", "Manage Sieve scripts");
                CtdlRegisterRoomHook(serv_sieve_room);
                CtdlRegisterSessionHook(perform_sieve_processing, EVT_HOUSE);
+               CtdlRegisterCleanupHook(cleanup_sieve);
        }
        
         /* return our Subversion id for the Log */
-       return "$Id$";
+       return "sieve";
 }