From 875ecc5883cbbaed06856c34f35a160d2fd7a0a5 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Sun, 3 Jun 2007 04:23:38 +0000 Subject: [PATCH] Fixed a memory leak created by the use of regcomp() --- citadel/msgbase.c | 8 ++++++++ citadel/sysdep_decls.h | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/citadel/msgbase.c b/citadel/msgbase.c index 102cb111e..4f80ff02f 100644 --- a/citadel/msgbase.c +++ b/citadel/msgbase.c @@ -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); } diff --git a/citadel/sysdep_decls.h b/citadel/sysdep_decls.h index 40e430819..1efd903e3 100644 --- a/citadel/sysdep_decls.h +++ b/citadel/sysdep_decls.h @@ -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 -- 2.39.2