3
3
4
4
/* https://github.com/anza-xyz/agave/blob/bff4df9cf6f41520a26c9838ee3d4d8c024a96a1/gossip/src/crds_data.rs#L22-L23 */
5
5
#define WALLCLOCK_MAX_MILLIS (1000000000000000UL)
6
+ #define MAX_SLOT (1000000000000000UL)
7
+
8
+ /* https://github.com/anza-xyz/agave/blob/master/gossip/src/epoch_slots.rs#L15 */
9
+ #define MAX_SLOTS_PER_EPOCH_SLOT (2048UL*8UL)
10
+
11
+ struct __attribute__((packed )) slot_hash_pair {
12
+ ulong slot ;
13
+ uchar hash [ 32UL ];
14
+ };
15
+
16
+ typedef struct slot_hash_pair slot_hash_pair_t ;
6
17
7
18
/* Adapted from fd_txn_parse.c */
8
19
#define CHECK_INIT ( payload , payload_sz , offset ) \
@@ -162,6 +173,8 @@ fd_gossip_msg_crds_vote_parse( fd_gossip_view_crds_value_t * crds_val,
162
173
ulong start_offset ) {
163
174
CHECK_INIT ( payload , payload_sz , start_offset );
164
175
CHECK_LEFT ( 1U ); crds_val -> vote -> index = FD_LOAD ( uchar , CURSOR ) ; INC ( 1U );
176
+ /* https://github.com/anza-xyz/agave/blob/bff4df9cf6f41520a26c9838ee3d4d8c024a96a1/gossip/src/crds_data.rs#L67-L107 */
177
+ CHECK ( crds_val -> vote -> index < FD_GOSSIP_VOTE_IDX_MAX );
165
178
CHECK_LEFT ( 32U ); crds_val -> pubkey_off = CUR_OFFSET ; INC ( 32U );
166
179
ulong transaction_sz ;
167
180
CHECK ( fd_txn_parse_core ( CURSOR , BYTES_REMAINING , NULL , NULL , & transaction_sz )!= 0UL );
@@ -178,7 +191,10 @@ fd_gossip_msg_crds_lowest_slot_parse( fd_gossip_view_crds_value_t * crds_val,
178
191
ulong payload_sz ,
179
192
ulong start_offset ) {
180
193
CHECK_INIT ( payload , payload_sz , start_offset );
181
- CHECKED_INC ( 1U ); /* deprecated */
194
+ CHECK_LEFT ( 1U ); uchar ix = FD_LOAD ( uchar , CURSOR ) ; INC ( 1U );
195
+ /* https://github.com/anza-xyz/agave/blob/bff4df9cf6f41520a26c9838ee3d4d8c024a96a1/gossip/src/crds_data.rs#L67-L107 */
196
+ CHECK ( !ix );
197
+
182
198
CHECK_LEFT ( 32U ); crds_val -> pubkey_off = CUR_OFFSET ; INC ( 32U );
183
199
184
200
CHECKED_INC ( 8U ); /* root: deprecated */
@@ -295,12 +311,16 @@ fd_gossip_msg_crds_duplicate_shred_parse( fd_gossip_view_crds_value_t * crds_val
295
311
CHECK_INIT ( payload , payload_sz , start_offset );
296
312
297
313
CHECK_LEFT ( 2U ); ds -> index = FD_LOAD ( ushort , CURSOR ) ; INC ( 2U );
314
+ /* https://github.com/anza-xyz/agave/blob/bff4df9cf6f41520a26c9838ee3d4d8c024a96a1/gossip/src/crds_data.rs#L67-L107 */
315
+ CHECK ( ds -> index < FD_GOSSIP_DUPLICATE_SHRED_IDX_MAX );
298
316
CHECK_LEFT ( 32U ); crds_val -> pubkey_off = CUR_OFFSET ; INC ( 32U );
299
317
CHECKED_WALLCLOCK_LOAD ( crds_val -> wallclock_nanos );
300
318
CHECK_LEFT ( 8U ); ds -> slot = FD_LOAD ( ulong , CURSOR ) ; INC ( 8U );
301
319
CHECKED_INC ( 4U + 1U ); /* (unused) + shred type (unused) */
302
320
CHECK_LEFT ( 1U ); ds -> num_chunks = FD_LOAD ( uchar , CURSOR ) ; INC ( 1U );
303
321
CHECK_LEFT ( 1U ); ds -> chunk_index = FD_LOAD ( uchar , CURSOR ) ; INC ( 1U );
322
+ /* https://github.com/anza-xyz/agave/blob/bff4df9cf6f41520a26c9838ee3d4d8c024a96a1/gossip/src/duplicate_shred.rs#L328-L336 */
323
+ CHECK ( ds -> chunk_index < ds -> num_chunks );
304
324
CHECK_LEFT ( 8U ); ds -> chunk_len = FD_LOAD ( ulong , CURSOR ) ; INC ( 8U );
305
325
CHECK_LEFT ( ds -> chunk_len ); ds -> chunk_off = CUR_OFFSET ; INC ( ds -> chunk_len );
306
326
return BYTES_CONSUMED ;
@@ -315,9 +335,22 @@ fd_gossip_msg_crds_snapshot_hashes_parse( fd_gossip_view_crds_value_t * crds_val
315
335
CHECK_LEFT ( 32U ); crds_val -> pubkey_off = CUR_OFFSET ; INC ( 32U );
316
336
CHECK_LEFT ( 40U ); crds_val -> snapshot_hashes -> full_off = CUR_OFFSET ; INC ( 40U );
317
337
CHECK_LEFT ( 8U ); ulong incremental_len = FD_LOAD ( ulong , CURSOR ) ; INC ( 8U );
338
+ CHECK ( incremental_len < (ULONG_MAX - 39U )/40U ); /* to prevent overflow in next check */
318
339
CHECK_LEFT ( incremental_len * 40U ); crds_val -> snapshot_hashes -> inc_off = CUR_OFFSET ; INC ( incremental_len * 40U );
319
340
CHECKED_WALLCLOCK_LOAD ( crds_val -> wallclock_nanos );
320
341
crds_val -> snapshot_hashes -> inc_len = incremental_len ;
342
+
343
+ /* https://github.com/anza-xyz/agave/blob/bff4df9cf6f41520a26c9838ee3d4d8c024a96a1/gossip/src/crds_data.rs#L265-L282 */
344
+ slot_hash_pair_t * full_pair = (slot_hash_pair_t * )(payload + crds_val -> snapshot_hashes -> full_off );
345
+ ulong full_slot = full_pair -> slot ;
346
+ CHECK ( full_slot < MAX_SLOT );
347
+
348
+ slot_hash_pair_t * inc_pair = (slot_hash_pair_t * )(payload + crds_val -> snapshot_hashes -> inc_off );
349
+ for ( ulong i = 0UL ; i < incremental_len ; i ++ ) {
350
+ CHECK ( inc_pair [i ].slot > full_slot );
351
+ CHECK ( inc_pair [i ].slot < MAX_SLOT );
352
+ }
353
+
321
354
return BYTES_CONSUMED ;
322
355
}
323
356
0 commit comments