@@ -226,9 +226,15 @@ fd_gossip_msg_crds_account_hashes_parse( fd_gossip_view_crds_value_t * crds_val,
226
226
CHECK_INIT ( payload , payload_sz , start_offset );
227
227
CHECK_LEFT ( 32U ); crds_val -> pubkey_off = CUR_OFFSET ; INC ( 32U );
228
228
CHECK_LEFT ( 8U ); ulong hashes_len = FD_LOAD ( ulong , CURSOR ) ; INC ( 8U );
229
- CHECKED_INC ( hashes_len * 32U ); /* overflowing this currently doesn't matter, but be careful */
230
-
229
+ slot_hash_pair_t const * hashes = (slot_hash_pair_t const * )CURSOR ;
230
+ CHECK ( hashes_len < (ULONG_MAX - 39U )/40U ); /* to prevent overflow in next check */
231
+ CHECKED_INC ( hashes_len * 40U );
231
232
CHECKED_WALLCLOCK_LOAD ( crds_val -> wallclock_nanos );
233
+
234
+ /* https://github.com/anza-xyz/agave/blob/bff4df9cf6f41520a26c9838ee3d4d8c024a96a1/gossip/src/crds_data.rs#L226-L230 */
235
+ for ( ulong i = 0UL ; i < hashes_len ; i ++ ) {
236
+ CHECK ( hashes [i ].slot < MAX_SLOT );
237
+ }
232
238
return BYTES_CONSUMED ;
233
239
}
234
240
@@ -239,18 +245,32 @@ fd_gossip_msg_crds_epoch_slots_parse( fd_gossip_view_crds_value_t * crds_val,
239
245
ulong start_offset ) {
240
246
CHECK_INIT ( payload , payload_sz , start_offset );
241
247
CHECK_LEFT ( 1U ); crds_val -> epoch_slots -> index = FD_LOAD ( uchar , CURSOR ) ; INC ( 1U );
248
+ /* https://github.com/anza-xyz/agave/blob/bff4df9cf6f41520a26c9838ee3d4d8c024a96a1/gossip/src/crds_data.rs#L67-L107 */
249
+ CHECK ( crds_val -> epoch_slots -> index < FD_GOSSIP_EPOCH_SLOTS_IDX_MAX );
242
250
CHECK_LEFT ( 32U ); crds_val -> pubkey_off = CUR_OFFSET ; INC ( 32U );
243
251
CHECK_LEFT ( 8U ); ulong slots_len = FD_LOAD ( ulong , CURSOR ) ; INC ( 8U );
244
252
245
253
for ( ulong i = 0UL ; i < slots_len ; i ++ ) {
246
254
CHECK_LEFT ( 4U ); uint is_uncompressed = FD_LOAD ( uint , CURSOR ) ; INC ( 4U );
247
255
if ( is_uncompressed ) {
256
+ CHECK_LEFT ( 8U ); ulong first_slot = FD_LOAD ( ulong , CURSOR ) ; INC ( 8U );
257
+ CHECK_LEFT ( 8U ); ulong num = FD_LOAD ( ulong , CURSOR ) ; INC ( 8U );
248
258
249
259
ulong bits_off , bits_len , bits_cnt ;
250
260
CHECKED_CALL_INC ( decode_bitvec_u8 ( payload , payload_sz , CUR_OFFSET , & bits_off , & bits_len , & bits_cnt ) );
251
261
262
+ /* https://github.com/anza-xyz/agave/blob/bff4df9cf6f41520a26c9838ee3d4d8c024a96a1/gossip/src/epoch_slots.rs#L24-L43 */
263
+ CHECK ( first_slot < MAX_SLOT );
264
+ CHECK ( num <=MAX_SLOTS_PER_EPOCH_SLOT );
265
+ CHECK ( bits_cnt %8U == 0U ); /* must be multiple of 8 */
266
+ CHECK ( bits_cnt == bits_len * 8U ); /* stricter than check in decode_bitvec_u8 */
252
267
} else {
253
- CHECKED_INC ( 8U + 8U ); /* first_slot + num */
268
+ /* https://github.com/anza-xyz/agave/blob/bff4df9cf6f41520a26c9838ee3d4d8c024a96a1/gossip/src/epoch_slots.rs#L79-L86*/
269
+ CHECK_LEFT ( 8U ); ulong first_slot = FD_LOAD ( ulong , CURSOR ) ; INC ( 8U );
270
+ CHECK_LEFT ( 8U ); ulong num = FD_LOAD ( ulong , CURSOR ) ; INC ( 8U );
271
+ CHECK ( first_slot < MAX_SLOT );
272
+ CHECK ( num <=MAX_SLOTS_PER_EPOCH_SLOT );
273
+
254
274
CHECK_LEFT ( 8U ); ulong compressed_len = FD_LOAD ( ulong , CURSOR ) ; INC ( 8U );
255
275
CHECKED_INC ( compressed_len ); /* compressed bitvec */
256
276
}
0 commit comments