@@ -11,7 +11,7 @@ static const u8 *pull(const u8 **cursor, size_t *max, void *copy, size_t n)
1111{
1212 const u8 * p = * cursor ;
1313
14- if (* max < n ) {
14+ if (! p || * max < n ) {
1515 * cursor = NULL ;
1616 * max = 0 ;
1717 /* Just make sure we don't leak uninitialized mem! */
@@ -60,6 +60,15 @@ static void sha256_varint(struct sha256_ctx *ctx, u64 val)
6060 sha256_update (ctx , vt , vtlen );
6161}
6262
63+ /* Only hashes the bytes if they were actually there */
64+ static void pull_and_hash (const u8 * * cursor , size_t * max ,
65+ struct sha256_ctx * shactx , size_t n )
66+ {
67+ const u8 * p = pull (cursor , max , NULL , n );
68+ if (p )
69+ sha256_update (shactx , p , n );
70+ }
71+
6372static void bitcoin_block_pull_dynafed_params (const u8 * * cursor , size_t * len , struct sha256_ctx * shactx )
6473{
6574 u8 type ;
@@ -73,49 +82,41 @@ static void bitcoin_block_pull_dynafed_params(const u8 **cursor, size_t *len, st
7382 /* "scriptPubKey" used for block signing */
7483 l1 = pull_varint (cursor , len );
7584 sha256_varint (shactx , l1 );
76- sha256_update (shactx , * cursor , l1 );
77- pull (cursor , len , NULL , l1 );
85+ pull_and_hash (cursor , len , shactx , l1 );
7886
7987 /* signblock_witness_limit */
80- sha256_update (shactx , * cursor , 4 );
81- pull (cursor , len , NULL , 4 );
88+ pull_and_hash (cursor , len , shactx , 4 );
8289
8390 /* Skip elided_root */
84- sha256_update (shactx , * cursor , 32 );
85- pull (cursor , len , NULL , 32 );
91+ pull_and_hash (cursor , len , shactx , 32 );
8692 break ;
8793
8894 case DYNAFED_PARAMS_FULL :
8995 /* "scriptPubKey" used for block signing */
9096 l1 = pull_varint (cursor , len );
9197 sha256_varint (shactx , l1 );
92- sha256_update (shactx , * cursor , l1 );
93- pull (cursor , len , NULL , l1 );
98+ pull_and_hash (cursor , len , shactx , l1 );
9499
95100 /* signblock_witness_limit */
96- sha256_update (shactx , * cursor , 4 );
97- pull (cursor , len , NULL , 4 );
101+ pull_and_hash (cursor , len , shactx , 4 );
98102
99103 /* fedpeg_program */
100104 l1 = pull_varint (cursor , len );
101105 sha256_varint (shactx , l1 );
102- sha256_update (shactx , * cursor , l1 );
103- pull (cursor , len , NULL , l1 );
106+ pull_and_hash (cursor , len , shactx , l1 );
104107
105108 /* fedpegscript */
106109 l1 = pull_varint (cursor , len );
107110 sha256_varint (shactx , l1 );
108- sha256_update (shactx , * cursor , l1 );
109- pull (cursor , len , NULL , l1 );
111+ pull_and_hash (cursor , len , shactx , l1 );
110112
111- /* extension space */
113+ /* extension space: stop once we've run out of data. */
112114 l2 = pull_varint (cursor , len );
113115 sha256_varint (shactx , l2 );
114- for (size_t i = 0 ; i < l2 ; i ++ ) {
116+ for (size_t i = 0 ; i < l2 && * cursor ; i ++ ) {
115117 l1 = pull_varint (cursor , len );
116118 sha256_varint (shactx , l1 );
117- sha256_update (shactx , * cursor , l1 );
118- pull (cursor , len , NULL , l1 );
119+ pull_and_hash (cursor , len , shactx , l1 );
119120 }
120121 break ;
121122 }
@@ -128,7 +129,7 @@ static void bitcoin_block_pull_dynafed_details(const u8 **cursor, size_t *len, s
128129
129130 /* Consume the signblock_witness */
130131 u64 numwitnesses = pull_varint (cursor , len );
131- for (size_t i = 0 ; i < numwitnesses ; i ++ ) {
132+ for (size_t i = 0 ; i < numwitnesses && * cursor ; i ++ ) {
132133 u64 witsize = pull_varint (cursor , len );
133134 pull (cursor , len , NULL , witsize );
134135 }
@@ -187,8 +188,7 @@ bitcoin_block_from_hex(const tal_t *ctx, const struct chainparams *chainparams,
187188 /* elemens_header.challenge */
188189 templen = pull_varint (& p , & len );
189190 sha256_varint (& shactx , templen );
190- sha256_update (& shactx , p , templen );
191- pull (& p , & len , NULL , templen );
191+ pull_and_hash (& p , & len , & shactx , templen );
192192
193193 /* elements_header.solution. Not hashed since it'd be
194194 * a circular dependency. */
@@ -206,6 +206,9 @@ bitcoin_block_from_hex(const tal_t *ctx, const struct chainparams *chainparams,
206206 sha256_double_done (& shactx , & b -> hdr .hash .shad );
207207
208208 num = pull_varint (& p , & len );
209+ /* Every tx takes at least one byte - dont let a bogus count make us allocate a huge array */
210+ if (num > len )
211+ return tal_free (b );
209212 b -> tx = tal_arr (b , struct bitcoin_tx * , num );
210213 b -> txids = tal_arr (b , struct bitcoin_txid , num );
211214 for (i = 0 ; i < num ; i ++ ) {
0 commit comments