diff --git a/src/generator.c b/src/generator.c index b2b5539d..421fa6d3 100644 --- a/src/generator.c +++ b/src/generator.c @@ -28,7 +28,7 @@ struct notify_instance { int id; char prevhash[68]; - char *jobid; + json_t *jobid; char *coinbase1; char *coinbase2; int coinb1len; @@ -403,7 +403,7 @@ out: return ret; } -static bool send_json_msg(connsock_t *cs, json_t *json_msg) +static bool send_json_msg(connsock_t *cs, const json_t *json_msg) { int len, sent; char *s; @@ -784,19 +784,19 @@ static bool parse_notify(ckpool_t *ckp, proxy_instance_t *proxi, json_t *val) { const char *prev_hash, *bbversion, *nbit, *ntime; proxy_instance_t *proxy = proxi->parent; - char *job_id, *coinbase1, *coinbase2; gdata_t *gdata = proxi->ckp->data; + char *coinbase1, *coinbase2; bool clean, ret = false; notify_instance_t *ni; + json_t *arr, *job_id; int merkles, i; - json_t *arr; arr = json_array_get(val, 4); if (!arr || !json_is_array(arr)) goto out; merkles = json_array_size(arr); - job_id = json_array_string(val, 0); + job_id = json_copy(json_array_get(val, 0)); prev_hash = __json_array_string(val, 1); coinbase1 = json_array_string(val, 2); coinbase2 = json_array_string(val, 3); @@ -806,7 +806,7 @@ static bool parse_notify(ckpool_t *ckp, proxy_instance_t *proxi, json_t *val) clean = json_is_true(json_array_get(val, 8)); if (!job_id || !prev_hash || !coinbase1 || !coinbase2 || !bbversion || !nbit || !ntime) { if (job_id) - free(job_id); + json_decref(job_id); if (coinbase1) free(coinbase1); if (coinbase2) @@ -817,7 +817,6 @@ static bool parse_notify(ckpool_t *ckp, proxy_instance_t *proxi, json_t *val) LOGDEBUG("Received new notify from proxy %d:%d", proxi->id, proxi->subid); ni = ckzalloc(sizeof(notify_instance_t)); ni->jobid = job_id; - LOGDEBUG("Job ID %s", job_id); ni->coinbase1 = coinbase1; LOGDEBUG("Coinbase1 %s", coinbase1); ni->coinb1len = strlen(coinbase1) / 2; @@ -1357,8 +1356,8 @@ static void submit_share(gdata_t *gdata, json_t *val) /* Get the client id so we can tell the stratifier to drop it if the * proxy it's bound to is not functional */ - json_getdel_int64(&client_id, val, "client_id"); - json_getdel_int(&id, val, "proxy"); + json_get_int64(&client_id, val, "client_id"); + json_get_int(&id, val, "proxy"); proxy = proxy_by_id(gdata, id); if (unlikely(!proxy)) { LOGWARNING("Failed to find proxy %d to send share to", id); @@ -1384,7 +1383,7 @@ static void submit_share(gdata_t *gdata, json_t *val) share = ckzalloc(sizeof(share_msg_t)); share->submit_time = time(NULL); share->client_id = client_id; - json_getdel_int(&share->msg_id, val, "msg_id"); + json_get_int(&share->msg_id, val, "msg_id"); msg->json_msg = val; /* Add new share entry to the share hashtable */ @@ -1404,7 +1403,8 @@ static void submit_share(gdata_t *gdata, json_t *val) static void clear_notify(notify_instance_t *ni) { - free(ni->jobid); + if (ni->jobid) + json_decref(ni->jobid); free(ni->coinbase1); free(ni->coinbase2); free(ni); @@ -1463,13 +1463,13 @@ static void *proxy_send(void *arg) while (42) { proxy_instance_t *subproxy; + int proxyid = 0, subid = 0; notify_instance_t *ni; + json_t *jobid = NULL; stratum_msg_t *msg; - char *jobid = NULL; bool ret = true; - int subid = 0; json_t *val; - uint32_t id; + int id; tv_t now; ts_t abs; @@ -1494,20 +1494,25 @@ static void *proxy_send(void *arg) if (!msg) continue; - json_getdel_int(&subid, msg->json_msg, "subproxy"); - json_uintcpy(&id, msg->json_msg, "jobid"); + json_get_int(&subid, msg->json_msg, "subproxy"); + json_get_int(&id, msg->json_msg, "jobid"); + json_get_int(&proxyid, msg->json_msg, "proxy"); + if (unlikely(proxyid != proxy->id)) { + LOGWARNING("Proxysend for proxy %d got message for proxy %d!", + proxy->id, proxyid); + } mutex_lock(&proxy->notify_lock); HASH_FIND_INT(proxy->notify_instances, &id, ni); if (ni) - jobid = strdup(ni->jobid); + jobid = json_copy(ni->jobid); mutex_unlock(&proxy->notify_lock); subproxy = subproxy_by_id(proxy, subid); if (subproxy) cs = subproxy->cs; if (jobid && subproxy) { - JSON_CPACK(val, "{s[ssooo]soss}", "params", proxy->auth, jobid, + JSON_CPACK(val, "{s[soooo]soss}", "params", proxy->auth, jobid, json_object_dup(msg->json_msg, "nonce2"), json_object_dup(msg->json_msg, "ntime"), json_object_dup(msg->json_msg, "nonce"), @@ -1522,7 +1527,6 @@ static void *proxy_send(void *arg) LOGNOTICE("Failed to find subproxy %d:%d to send message to", proxy->id, subid); } - free(jobid); json_decref(msg->json_msg); free(msg); if (!ret && subproxy) {