diff --git a/blkmaker_jansson.c b/blkmaker_jansson.c index 5f2b65c..d20695a 100644 --- a/blkmaker_jansson.c +++ b/blkmaker_jansson.c @@ -134,6 +134,17 @@ json_t *blktmpl_request_jansson(const uint32_t caps, const char * const lpid) { tmpl->key = tmp; \ } while(0) +#define GETNUM_T(key, type) do { \ + GET(key, number); \ + const double tmpd = json_number_value(v); \ + const type tmp = tmpd; \ + /* This checks if it's merely being truncated, and tolerates it */ \ + if (tmpd != tmp && !((tmpd < 0) ? (tmpd < tmp && tmpd + 1 > tmp) : (tmpd > tmp && tmpd - 1 < tmp))) { \ + return "Invalid number value for '" #key "'"; \ + } \ + tmpl->key = tmp; \ +} while(0) + #define GETNUM_O2(key, skey, type) do { \ if ((v = json_object_get(json, #skey)) && json_is_number(v)) { \ const double tmpd = json_number_value(v); \ @@ -146,6 +157,17 @@ json_t *blktmpl_request_jansson(const uint32_t caps, const char * const lpid) { #define GETNUM_O(key, type) GETNUM_O2(key, key, type) +#define GETNUM_OT(key, type) do { \ + if ((v = json_object_get(json, #key)) && json_is_number(v)) { \ + const double tmpd = json_number_value(v); \ + const type tmp = tmpd; \ + /* This checks if it's merely being truncated, and tolerates it */ \ + if (tmpd == tmp || ((tmpd < 0) ? (tmpd < tmp && tmpd + 1 > tmp) : (tmpd > tmp && tmpd - 1 < tmp))) { \ + tmpl->key = tmp; \ + } \ + } \ +} while(0) + #define GETSTR(key, skey) do { \ if ((v = json_object_get(json, #key)) && json_is_string(v)) \ if (!(tmpl->skey = strdup(json_string_value(v)))) \ @@ -224,7 +246,7 @@ const char *blktmpl_add_jansson(blktemplate_t *tmpl, const json_t *json, time_t GETHEX(bits, diffbits); my_flip(tmpl->diffbits, 4); - GETNUM(curtime, blktime_t); + GETNUM_T(curtime, blktime_t); GETNUM(height, blkheight_t); GETHEX(previousblockhash, prevblk); my_flip(tmpl->prevblk, 32); @@ -236,11 +258,11 @@ const char *blktmpl_add_jansson(blktemplate_t *tmpl, const json_t *json, time_t GETSTR(workid, workid); - GETNUM_O(expires, int16_t); - GETNUM_O(maxtime, blktime_t); - GETNUM_O(maxtimeoff, blktime_diff_t); - GETNUM_O(mintime, blktime_t); - GETNUM_O(mintimeoff, blktime_diff_t); + GETNUM_OT(expires, int16_t); + GETNUM_OT(maxtime, blktime_t); + GETNUM_OT(maxtimeoff, blktime_diff_t); + GETNUM_OT(mintime, blktime_t); + GETNUM_OT(mintimeoff, blktime_diff_t); GETSTR(longpollid, lp.id); GETSTR(longpolluri, lp.uri);