aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstat
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2016-02-29 15:26:43 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2016-02-29 15:26:43 +0000
commit236b4ab67c51170088c19c8c22ceb1a05240112b (patch)
treeafd0d942dedf4968934c275748082c9582a1f6e6 /src/libstat
parent2cbece2248e8a90b7a71319ae59b638b36ced6df (diff)
downloadrspamd-236b4ab67c51170088c19c8c22ceb1a05240112b.tar.gz
rspamd-236b4ab67c51170088c19c8c22ceb1a05240112b.zip
[Fix] Fix redis stats to avoid double free
Diffstat (limited to 'src/libstat')
-rw-r--r--src/libstat/backends/redis_backend.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/libstat/backends/redis_backend.c b/src/libstat/backends/redis_backend.c
index ae47eef9f..5fbb7f2da 100644
--- a/src/libstat/backends/redis_backend.c
+++ b/src/libstat/backends/redis_backend.c
@@ -84,6 +84,7 @@ struct rspamd_redis_stat_cbdata {
GPtrArray *cur_keys;
struct upstream *selected;
guint inflight;
+ gboolean wanna_die;
};
#define GET_TASK_ELT(task, elt) (task == NULL ? NULL : (task)->elt)
@@ -425,7 +426,9 @@ rspamd_redis_async_cbdata_cleanup (struct rspamd_redis_stat_cbdata *cbdata)
guint i;
gchar *k;
- if (cbdata) {
+ if (cbdata && !cbdata->wanna_die) {
+ /* Avoid double frees */
+ cbdata->wanna_die = TRUE;
redisAsyncFree (cbdata->redis);
for (i = 0; i < cbdata->cur_keys->len; i ++) {
@@ -468,6 +471,10 @@ rspamd_redis_stat_learns (redisAsyncContext *c, gpointer r, gpointer priv)
ucl_object_t *obj;
gulong num = 0;
+ if (cbdata->wanna_die) {
+ return;
+ }
+
cbdata->inflight --;
if (c->err == 0 && r != NULL) {
@@ -498,6 +505,10 @@ rspamd_redis_stat_key (redisAsyncContext *c, gpointer r, gpointer priv)
ucl_object_t *obj;
glong num = 0;
+ if (cbdata->wanna_die) {
+ return;
+ }
+
cbdata->inflight --;
if (c->err == 0 && r != NULL) {
@@ -545,6 +556,11 @@ rspamd_redis_stat_keys (redisAsyncContext *c, gpointer r, gpointer priv)
gchar **pk, *k;
guint i, processed = 0;
+
+ if (cbdata->wanna_die) {
+ return;
+ }
+
cbdata->inflight --;
if (c->err == 0 && r != NULL) {