Skip to content

Commit 4ed5c4e

Browse files
committed
gossip: epoch slots and account hashes sanitizers
1 parent 75ae28f commit 4ed5c4e

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

src/flamenco/gossip/fd_gossip_msg_parse.c

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -226,9 +226,15 @@ fd_gossip_msg_crds_account_hashes_parse( fd_gossip_view_crds_value_t * crds_val,
226226
CHECK_INIT( payload, payload_sz, start_offset );
227227
CHECK_LEFT( 32U ); crds_val->pubkey_off = CUR_OFFSET ; INC( 32U );
228228
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 );
231232
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+
}
232238
return BYTES_CONSUMED;
233239
}
234240

@@ -239,18 +245,32 @@ fd_gossip_msg_crds_epoch_slots_parse( fd_gossip_view_crds_value_t * crds_val,
239245
ulong start_offset ) {
240246
CHECK_INIT( payload, payload_sz, start_offset );
241247
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 );
242250
CHECK_LEFT( 32U ); crds_val->pubkey_off = CUR_OFFSET ; INC( 32U );
243251
CHECK_LEFT( 8U ); ulong slots_len = FD_LOAD( ulong, CURSOR ) ; INC( 8U );
244252

245253
for( ulong i=0UL; i<slots_len; i++ ) {
246254
CHECK_LEFT( 4U ); uint is_uncompressed = FD_LOAD( uint, CURSOR ) ; INC( 4U );
247255
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 );
248258

249259
ulong bits_off, bits_len, bits_cnt;
250260
CHECKED_CALL_INC( decode_bitvec_u8( payload, payload_sz, CUR_OFFSET, &bits_off, &bits_len, &bits_cnt ) );
251261

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 */
252267
} 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+
254274
CHECK_LEFT( 8U ); ulong compressed_len = FD_LOAD( ulong, CURSOR ) ; INC( 8U );
255275
CHECKED_INC( compressed_len ); /* compressed bitvec */
256276
}

src/flamenco/gossip/fd_gossip_private.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ struct fd_gossip_view_vote {
192192

193193
typedef struct fd_gossip_view_vote fd_gossip_view_vote_t;
194194

195+
#define FD_GOSSIP_EPOCH_SLOTS_IDX_MAX (255U)
195196
struct fd_gossip_view_epoch_slots {
196197
uchar index;
197198
};

0 commit comments

Comments
 (0)