Fixed a memory leak created by the use of regcomp()
authorArt Cancro <ajc@citadel.org>
Sun, 3 Jun 2007 04:23:38 +0000 (04:23 +0000)
committerArt Cancro <ajc@citadel.org>
Sun, 3 Jun 2007 04:23:38 +0000 (04:23 +0000)
citadel/msgbase.c
citadel/sysdep_decls.h

index 102cb111e549d8052bbba1daa3d4f323f90b174e..4f80ff02f944667273e8471351862bb61c31e488 100644 (file)
@@ -530,10 +530,12 @@ int CtdlForEachMessage(int mode, long ref, char *search_string,
        int num_search_msgs = 0;
        long *search_msgs = NULL;
        regex_t re;
+       int need_to_free_re = 0;
        regmatch_t pm;
 
        if (content_type) if (strlen(content_type) > 0) {
                regcomp(&re, content_type, 0);
+               need_to_free_re = 1;
        }
 
        /* Learn about the user and room in question */
@@ -548,6 +550,7 @@ int CtdlForEachMessage(int mode, long ref, char *search_string,
                num_msgs = cdbfr->len / sizeof(long);
                cdb_free(cdbfr);
        } else {
+               if (need_to_free_re) regfree(&re);
                return 0;       /* No messages at all?  No further action. */
        }
 
@@ -676,6 +679,7 @@ int CtdlForEachMessage(int mode, long ref, char *search_string,
                        }
                }
        free(msglist);          /* Clean up */
+       if (need_to_free_re) regfree(&re);
        return num_processed;
 }
 
@@ -3617,9 +3621,11 @@ int CtdlDeleteMessages(char *room_name,          /* which room */
        struct MetaData smi;
        regex_t re;
        regmatch_t pm;
+       int need_to_free_re = 0;
 
        if (content_type) if (strlen(content_type) > 0) {
                regcomp(&re, content_type, 0);
+               need_to_free_re = 1;
        }
        lprintf(CTDL_DEBUG, "CtdlDeleteMessages(%s, %d msgs, %s)\n",
                room_name, num_dmsgnums, content_type);
@@ -3628,6 +3634,7 @@ int CtdlDeleteMessages(char *room_name,           /* which room */
        if (lgetroom(&qrbuf, room_name) != 0) {
                lprintf(CTDL_ERR, "CtdlDeleteMessages(): Room <%s> not found\n",
                        room_name);
+               if (need_to_free_re) regfree(&re);
                return (0);     /* room not found */
        }
        cdbfr = cdb_fetch(CDB_MSGLISTS, &qrbuf.QRnumber, sizeof(long));
@@ -3700,6 +3707,7 @@ int CtdlDeleteMessages(char *room_name,           /* which room */
        if (msglist != NULL) free(msglist);
        if (dellist != NULL) free(dellist);
        lprintf(CTDL_DEBUG, "%d message(s) deleted.\n", num_deleted);
+       if (need_to_free_re) regfree(&re);
        return (num_deleted);
 }
 
index 40e43081962012896160bdf897865b47d3c4aec7..1efd903e384edbe9c0422b116a8e3c430f9b3256 100644 (file)
@@ -5,8 +5,8 @@
  * Uncomment this #define if you are a Citadel developer tracking
  * down memory leaks in the server.  Do NOT do this on a production
  * system because it definitely incurs a lot of additional overhead.
+#define DEBUG_MEMORY_LEAKS
  */
-/* #define DEBUG_MEMORY_LEAKS */
 
 
 #include <pthread.h>