diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2017-11-10 19:26:20 +0000 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2017-11-10 19:26:20 +0000 |
commit | 44b9961895e11117b8500ae0d070046670f998e6 (patch) | |
tree | a032fcc40896a56dced485a91dfc547eb99e037a /src/libmime | |
parent | 8b1cf85652664b562a70060fc30e62b90823daee (diff) | |
download | rspamd-44b9961895e11117b8500ae0d070046670f998e6.tar.gz rspamd-44b9961895e11117b8500ae0d070046670f998e6.zip |
[Fix] Plug memory leak when setting email addresses from Lua
+ Optimize emails addr structure and API
MFH: rspamd-1.6
Diffstat (limited to 'src/libmime')
-rw-r--r-- | src/libmime/email_addr.c | 39 | ||||
-rw-r--r-- | src/libmime/email_addr.h | 21 |
2 files changed, 17 insertions, 43 deletions
diff --git a/src/libmime/email_addr.c b/src/libmime/email_addr.c index 9e69b68ec..08071afc8 100644 --- a/src/libmime/email_addr.c +++ b/src/libmime/email_addr.c @@ -21,20 +21,6 @@ #include "smtp_parsers.h" static void -rspamd_email_addr_dtor (struct rspamd_email_address *addr) -{ - if (addr->flags & RSPAMD_EMAIL_ADDR_ADDR_ALLOCATED) { - g_free ((void *)addr->addr); - } - - if (addr->flags & RSPAMD_EMAIL_ADDR_USER_ALLOCATED) { - g_free ((void *)addr->user); - } - - g_free (addr); -} - -static void rspamd_email_address_unescape (struct rspamd_email_address *addr) { const char *h, *end; @@ -92,26 +78,24 @@ rspamd_email_address_from_smtp (const gchar *str, guint len) ret->flags |= RSPAMD_EMAIL_ADDR_ADDR_ALLOCATED; } - REF_INIT_RETAIN (ret, rspamd_email_addr_dtor); - return ret; } return NULL; } -struct rspamd_email_address * -rspamd_email_address_ref (struct rspamd_email_address *addr) +void +rspamd_email_address_free (struct rspamd_email_address *addr) { - REF_RETAIN (addr); + if (addr->flags & RSPAMD_EMAIL_ADDR_ADDR_ALLOCATED) { + g_free ((void *)addr->addr); + } - return addr; -} + if (addr->flags & RSPAMD_EMAIL_ADDR_USER_ALLOCATED) { + g_free ((void *)addr->user); + } -void -rspamd_email_address_unref (struct rspamd_email_address *addr) -{ - REF_RELEASE (addr); + g_free (addr); } static inline void @@ -152,11 +136,8 @@ rspamd_email_address_add (rspamd_mempool_t *pool, elt->flags |= RSPAMD_EMAIL_ADDR_ADDR_ALLOCATED; } - REF_INIT_RETAIN (elt, rspamd_email_addr_dtor); - if (name->len > 0) { elt->name = rspamd_mime_header_decode (pool, name->str, name->len); - elt->name_len = strlen (elt->name); } g_ptr_array_add (ar, elt); @@ -435,7 +416,7 @@ rspamd_email_address_list_destroy (gpointer ptr) struct rspamd_email_address *addr; PTR_ARRAY_FOREACH (ar, i, addr) { - REF_RELEASE (addr); + rspamd_email_address_free (addr); } g_ptr_array_free (ar, TRUE); diff --git a/src/libmime/email_addr.h b/src/libmime/email_addr.h index b4f192ee7..8c9b54713 100644 --- a/src/libmime/email_addr.h +++ b/src/libmime/email_addr.h @@ -28,11 +28,10 @@ enum rspamd_email_address_flags { RSPAMD_EMAIL_ADDR_BRACED = (1 << 2), RSPAMD_EMAIL_ADDR_QUOTED = (1 << 3), RSPAMD_EMAIL_ADDR_EMPTY = (1 << 4), - RSPAMD_EMAIL_ADDR_SMTP = (1 << 5), - RSPAMD_EMAIL_ADDR_HAS_BACKSLASH = (1 << 6), - RSPAMD_EMAIL_ADDR_ADDR_ALLOCATED = (1 << 7), - RSPAMD_EMAIL_ADDR_USER_ALLOCATED = (1 << 8), - RSPAMD_EMAIL_ADDR_HAS_8BIT = (1 << 9), + RSPAMD_EMAIL_ADDR_HAS_BACKSLASH = (1 << 5), + RSPAMD_EMAIL_ADDR_ADDR_ALLOCATED = (1 << 6), + RSPAMD_EMAIL_ADDR_USER_ALLOCATED = (1 << 7), + RSPAMD_EMAIL_ADDR_HAS_8BIT = (1 << 8), }; /* @@ -47,12 +46,9 @@ struct rspamd_email_address { guint raw_len; guint addr_len; - guint user_len; guint domain_len; - guint name_len; - enum rspamd_email_address_flags flags; - - ref_entry_t ref; + guint16 user_len; + guchar flags; }; /** @@ -84,9 +80,6 @@ GPtrArray *rspamd_email_address_from_mime (rspamd_mempool_t *pool, */ void rspamd_email_address_list_destroy (gpointer ptr); -struct rspamd_email_address * rspamd_email_address_ref ( - struct rspamd_email_address *addr); - -void rspamd_email_address_unref (struct rspamd_email_address *addr); +void rspamd_email_address_free (struct rspamd_email_address *addr); #endif /* SRC_LIBMIME_EMAIL_ADDR_H_ */ |