From 981b1dc4feb0b9d47c6603e79b5f995e1ccd65d5 Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Thu, 11 Aug 2016 23:35:58 +0000 Subject: [PATCH] Bugfix: Include block header and transaction count in sizelimit checks --- blkmaker.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/blkmaker.c b/blkmaker.c index b529240..5c5f377 100644 --- a/blkmaker.c +++ b/blkmaker.c @@ -49,6 +49,13 @@ bool _blkmk_dblsha256(void *hash, const void *data, size_t datasz) { #define max_varint_size (9) +static char varintEncode(unsigned char *, uint64_t); + +static uint8_t blkmk_varint_encode_size(const uint64_t n) { + uint8_t dummy[max_varint_size]; + return varintEncode(dummy, n); +} + uint64_t blkmk_init_generation3(blktemplate_t * const tmpl, const void * const script, const size_t scriptsz, bool * const inout_newcb) { if (tmpl->cbtxn && !(*inout_newcb && (tmpl->mutations & BMM_GENERATE))) { @@ -120,7 +127,8 @@ uint64_t blkmk_init_generation3(blktemplate_t * const tmpl, const void * const s memset(&data[off], 0, 4); // lock time off += 4; - if (tmpl->txns_datasz + off > tmpl->sizelimit) { + const unsigned long pretx_size = libblkmaker_blkheader_size + blkmk_varint_encode_size(1 + tmpl->txncount); + if (pretx_size + tmpl->txns_datasz + off > tmpl->sizelimit) { free(data); return 0; } @@ -264,7 +272,8 @@ bool _blkmk_append_cb(blktemplate_t * const tmpl, void * const vout, const void if (in[cbScriptSigLen] > libblkmaker_coinbase_size_limit - appendsz) return false; - if (tmpl->cbtxn->datasz + tmpl->txns_datasz + appendsz > tmpl->sizelimit) { + const unsigned long pretx_size = libblkmaker_blkheader_size + blkmk_varint_encode_size(1 + tmpl->txncount); + if (pretx_size + tmpl->cbtxn->datasz + tmpl->txns_datasz + appendsz > tmpl->sizelimit) { return false; } @@ -305,7 +314,8 @@ ssize_t blkmk_append_coinbase_safe2(blktemplate_t * const tmpl, const void * con } size_t availsz = libblkmaker_coinbase_size_limit - extranoncesz - tmpl->cbtxn->data[cbScriptSigLen]; { - const size_t current_blocksize = tmpl->cbtxn->datasz + tmpl->txns_datasz; + const unsigned long pretx_size = libblkmaker_blkheader_size + blkmk_varint_encode_size(1 + tmpl->txncount); + const size_t current_blocksize = pretx_size + tmpl->cbtxn->datasz + tmpl->txns_datasz; if (current_blocksize > tmpl->sizelimit) { return -4; }