Browse Source

Add some sanity checking to params sent with share submission and clear memory used when workbases are dropped

master
Con Kolivas 11 years ago
parent
commit
cecaad4095
  1. 59
      src/stratifier.c

59
src/stratifier.c

@ -247,6 +247,14 @@ static void generate_coinbase(ckpool_t *ckp, workbase_t *wb)
static void stratum_broadcast_update(bool clean); static void stratum_broadcast_update(bool clean);
static void clear_workbase(workbase_t *wb)
{
free(wb->flags);
free(wb->txn_data);
json_decref(wb->merkle_array);
free(wb);
}
/* This function assumes it will only receive a valid json gbt base template /* This function assumes it will only receive a valid json gbt base template
* since checking should have been done earlier, and creates the base template * since checking should have been done earlier, and creates the base template
* for generating work templates. */ * for generating work templates. */
@ -305,8 +313,10 @@ static void update_base(ckpool_t *ckp)
sprintf(wb->idstring, "%08x", wb->id); sprintf(wb->idstring, "%08x", wb->id);
HASH_ITER(hh, workbases, tmp, tmpa) { HASH_ITER(hh, workbases, tmp, tmpa) {
/* Age old workbases older than 10 minutes old */ /* Age old workbases older than 10 minutes old */
if (tmp->gentime < wb->gentime - 600) if (tmp->gentime < wb->gentime - 600) {
HASH_DEL(workbases, tmp); HASH_DEL(workbases, tmp);
clear_workbase(tmp);
}
} }
HASH_ADD_INT(workbases, id, wb); HASH_ADD_INT(workbases, id, wb);
current_workbase = wb; current_workbase = wb;
@ -614,7 +624,52 @@ out:
static json_t *parse_submit(stratum_instance_t *client, json_t *params_val, json_t **err_val) static json_t *parse_submit(stratum_instance_t *client, json_t *params_val, json_t **err_val)
{ {
return json_boolean(true); const char *user, *job_id, *nonce2, *ntime, *nonce;
bool ret = false;
int wb_id;
if (unlikely(!json_is_array(params_val))) {
*err_val = json_string("params not an array");
goto out;
}
if (unlikely(json_array_size(params_val) != 5)) {
*err_val = json_string("Invalid array size");
goto out;
}
user = json_string_value(json_array_get(params_val, 0));
if (unlikely(!user || !strlen(user))) {
*err_val = json_string("No username");
goto out;
}
job_id = json_string_value(json_array_get(params_val, 1));
if (unlikely(!job_id || !strlen(job_id))) {
*err_val = json_string("No job_id");
goto out;
}
nonce2 = json_string_value(json_array_get(params_val, 2));
if (unlikely(!nonce2 || !strlen(nonce2))) {
*err_val = json_string("No nonce2");
goto out;
}
ntime = json_string_value(json_array_get(params_val, 3));
if (unlikely(!ntime || !strlen(ntime))) {
*err_val = json_string("No ntime");
goto out;
}
nonce = json_string_value(json_array_get(params_val, 4));
if (unlikely(!nonce || !strlen(nonce))) {
*err_val = json_string("No nonce");
goto out;
}
if (strcmp(user, client->workername)) {
*err_val = json_string("Worker mismatch");
goto out;
}
sscanf(job_id, "%08x", &wb_id);
ret = true;
out:
return json_boolean(ret);
} }
/* We should have already determined all the values passed to this are valid /* We should have already determined all the values passed to this are valid

Loading…
Cancel
Save