diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2016-09-28 14:30:13 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2016-09-28 14:30:13 +0100 |
commit | 388c08c712c8279a52ad82caa213191352639ca9 (patch) | |
tree | 9f12bba4be9b9772044928949c920175fa89d072 /src/libserver | |
parent | 61dbbe0eca5291b1329393a5fe1903fde415a243 (diff) | |
download | rspamd-388c08c712c8279a52ad82caa213191352639ca9.tar.gz rspamd-388c08c712c8279a52ad82caa213191352639ca9.zip |
[Feature] Stop using of GLists for headers, improve performance
Diffstat (limited to 'src/libserver')
-rw-r--r-- | src/libserver/dkim.c | 47 | ||||
-rw-r--r-- | src/libserver/re_cache.c | 7 | ||||
-rw-r--r-- | src/libserver/task.c | 4 |
3 files changed, 17 insertions, 41 deletions
diff --git a/src/libserver/dkim.c b/src/libserver/dkim.c index 2d968bd0f..aedcf99c9 100644 --- a/src/libserver/dkim.c +++ b/src/libserver/dkim.c @@ -1709,43 +1709,25 @@ rspamd_dkim_canonize_header (struct rspamd_dkim_common_ctx *ctx, const gchar *dkim_header, const gchar *dkim_domain) { - struct raw_header *rh, *rh_iter; - guint rh_num = 0; - guint i; - GPtrArray *sign_headers; + struct raw_header *rh; + guint rh_num = 0, i; + GPtrArray *ar; if (dkim_header == NULL) { - rh = g_hash_table_lookup (task->raw_headers, header_name); - - if (rh) { - LL_FOREACH (rh, rh_iter) { - rh_num++; - } + ar = g_hash_table_lookup (task->raw_headers, header_name); - if (rh_num > count) { + if (ar) { + if (ar->len > count) { /* Set skip count */ - rh_num -= count; + rh_num = ar->len - count; } else { rh_num = 0; } - sign_headers = g_ptr_array_sized_new (rh_num); - /* Skip number of headers */ - rh_iter = rh; - while (rh_num) { - rh_iter = rh_iter->next; - rh_num--; - } - /* Now insert required headers */ - while (rh_iter) { - g_ptr_array_add (sign_headers, rh_iter); - rh_iter = rh_iter->next; - } - - for (i = 0; i < sign_headers->len; i ++) { - rh = g_ptr_array_index (sign_headers, i); + for (i = rh_num; i < ar->len; i ++) { + rh = g_ptr_array_index (ar, i); if (ctx->header_canon_type == DKIM_CANON_SIMPLE) { rspamd_dkim_hash_update (ctx->headers_hash, rh->raw_value, @@ -1756,30 +1738,25 @@ rspamd_dkim_canonize_header (struct rspamd_dkim_common_ctx *ctx, else { if (!rspamd_dkim_canonize_header_relaxed (ctx, rh->value, header_name, FALSE)) { - - g_ptr_array_free (sign_headers, TRUE); return FALSE; } } } - - g_ptr_array_free (sign_headers, TRUE); } } else { /* For signature check just use the saved dkim header */ if (ctx->header_canon_type == DKIM_CANON_SIMPLE) { /* We need to find our own signature and use it */ - rh = g_hash_table_lookup (task->raw_headers, DKIM_SIGNHEADER); + ar = g_hash_table_lookup (task->raw_headers, DKIM_SIGNHEADER); - if (rh) { + if (ar) { /* We need to find our own signature */ if (!dkim_domain) { return FALSE; } - - LL_FOREACH (rh, rh_iter) { + PTR_ARRAY_FOREACH (ar, i, rh) { if (rspamd_substring_search_twoway (rh->raw_value, rh->raw_len, dkim_domain, strlen (dkim_domain)) != -1) { diff --git a/src/libserver/re_cache.c b/src/libserver/re_cache.c index c2ade15c5..955aa91e0 100644 --- a/src/libserver/re_cache.c +++ b/src/libserver/re_cache.c @@ -742,7 +742,6 @@ rspamd_re_cache_exec_re (struct rspamd_task *task, { guint ret = 0, i, re_id; GPtrArray *headerlist; - GList *slist; GHashTableIter it; struct raw_header *rh; const gchar *in, *end; @@ -966,10 +965,10 @@ rspamd_re_cache_exec_re (struct rspamd_task *task, * of the body content. */ - slist = rspamd_message_get_header (task, "Subject", FALSE); + headerlist = rspamd_message_get_header_array (task, "Subject", FALSE); - if (slist) { - rh = slist->data; + if (headerlist && headerlist->len > 0) { + rh = g_ptr_array_index (headerlist, 0); scvec[0] = (guchar *)rh->decoded; lenvec[0] = strlen (rh->decoded); diff --git a/src/libserver/task.c b/src/libserver/task.c index 950564b2d..e6cede086 100644 --- a/src/libserver/task.c +++ b/src/libserver/task.c @@ -88,8 +88,8 @@ rspamd_task_new (struct rspamd_worker *worker, struct rspamd_config *cfg) (rspamd_mempool_destruct_t) g_hash_table_unref, new_task->results); - new_task->raw_headers = g_hash_table_new (rspamd_strcase_hash, - rspamd_strcase_equal); + new_task->raw_headers = g_hash_table_new_full (rspamd_strcase_hash, + rspamd_strcase_equal, NULL, rspamd_ptr_array_free_hard); new_task->request_headers = g_hash_table_new_full (rspamd_ftok_icase_hash, rspamd_ftok_icase_equal, rspamd_fstring_mapped_ftok_free, rspamd_request_header_dtor); |