From 8fa5ddfd2ca581d30ec21ade08332294b481d31c Mon Sep 17 00:00:00 2001 From: Maksym Borodin Date: Wed, 13 Nov 2013 11:57:29 +0100 Subject: [PATCH] util.c: Decreasing reference count on allocated JSON obects to prevent memory leak --- util.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/util.c b/util.c index 8097eb8d..3a7c61a0 100644 --- a/util.c +++ b/util.c @@ -1736,8 +1736,10 @@ bool parse_method(struct pool *pool, char *s) } method = json_object_get(val, "method"); - if (!method) + if (!method) { + json_decref(val); return ret; + } err_val = json_object_get(val, "error"); params = json_object_get(val, "params"); @@ -1751,42 +1753,51 @@ bool parse_method(struct pool *pool, char *s) applog(LOG_INFO, "JSON-RPC method decode failed: %s", ss); + json_decref(val); free(ss); return ret; } buf = (char *)json_string_value(method); - if (!buf) + if (!buf) { + json_decref(val); return ret; + } if (!strncasecmp(buf, "mining.notify", 13)) { if (parse_notify(pool, params)) pool->stratum_notify = ret = true; else pool->stratum_notify = ret = false; + json_decref(val); return ret; } if (!strncasecmp(buf, "mining.set_difficulty", 21) && parse_diff(pool, params)) { ret = true; + json_decref(val); return ret; } if (!strncasecmp(buf, "client.reconnect", 16) && parse_reconnect(pool, params)) { ret = true; + json_decref(val); return ret; } if (!strncasecmp(buf, "client.get_version", 18) && send_version(pool, val)) { ret = true; + json_decref(val); return ret; } if (!strncasecmp(buf, "client.show_message", 19) && show_message(pool, params)) { ret = true; + json_decref(val); return ret; } + json_decref(val); return ret; } @@ -1829,13 +1840,16 @@ bool auth_stratum(struct pool *pool) applog(LOG_WARNING, "pool %d JSON stratum auth failed: %s", pool->pool_no, ss); free(ss); - return ret; + goto out; } ret = true; applog(LOG_INFO, "Stratum authorisation success for pool %d", pool->pool_no); pool->probed = true; successful_connect = true; + +out: + json_decref(val); return ret; } @@ -2381,6 +2395,7 @@ out: applog(LOG_DEBUG, "Failed to resume stratum, trying afresh"); noresume = true; + json_decref(val); goto resend; } applog(LOG_DEBUG, "Initiate stratum failed"); @@ -2388,6 +2403,7 @@ out: suspend_stratum(pool); } + json_decref(val); return ret; }