1
1
#include "fd_alloc.h"
2
2
#include "fd_alloc_cfg.h"
3
3
#include "../sanitize/fd_asan.h"
4
+ #include "../sanitize/fd_msan.h"
4
5
/* Note: this will still compile on platforms without FD_HAS_ATOMIC. It
5
6
should only be used single threaded in those use cases. (The code
6
7
does imitate at a very low level the operations required by
@@ -291,6 +292,7 @@ fd_alloc_private_inactive_stack_pop( fd_alloc_vgaddr_t * inactive_stack,
291
292
292
293
/**/ top_gaddr = (ulong )fd_alloc_vgaddr_off ( old );
293
294
ulong top_ver = (ulong )fd_alloc_vgaddr_ver ( old );
295
+ fd_msan_unpoison ( & top_gaddr , sizeof ( top_gaddr ) );
294
296
if ( FD_UNLIKELY ( !top_gaddr ) ) break ;
295
297
296
298
/* Try to pop the top of the inactive stack. */
@@ -597,11 +599,11 @@ fd_alloc_tag( fd_alloc_t * join ) {
597
599
return FD_LIKELY ( join ) ? fd_alloc_private_join_alloc ( join )-> tag : 0UL ;
598
600
}
599
601
600
- void *
601
- fd_alloc_malloc_at_least ( fd_alloc_t * join ,
602
- ulong align ,
603
- ulong sz ,
604
- ulong * max ) {
602
+ static inline void *
603
+ fd_alloc_malloc_at_least_impl ( fd_alloc_t * join ,
604
+ ulong align ,
605
+ ulong sz ,
606
+ ulong * max ) {
605
607
606
608
if ( FD_UNLIKELY ( !max ) ) return NULL ;
607
609
@@ -885,6 +887,16 @@ fd_alloc_malloc_at_least( fd_alloc_t * join,
885
887
return fd_alloc_hdr_store ( (void * )alloc_laddr , superblock , block_idx , sizeclass );
886
888
}
887
889
890
+ void *
891
+ fd_alloc_malloc_at_least ( fd_alloc_t * join ,
892
+ ulong align ,
893
+ ulong sz ,
894
+ ulong * max ) {
895
+ void * res = fd_alloc_malloc_at_least_impl ( join , align , sz , max );
896
+ fd_msan_poison ( res , * max );
897
+ return res ;
898
+ }
899
+
888
900
void
889
901
fd_alloc_free ( fd_alloc_t * join ,
890
902
void * laddr ) {
@@ -1277,6 +1289,7 @@ fd_alloc_superblock_fprintf( fd_wksp_t * wksp, /* non-NULL */
1277
1289
uchar * laddr_est = (uchar * )fd_wksp_laddr_fast ( wksp , gaddr_est );
1278
1290
fd_alloc_hdr_t hdr = FD_LOAD ( fd_alloc_hdr_t , laddr_est - sizeof (fd_alloc_hdr_t ) );
1279
1291
1292
+ fd_msan_unpoison ( & hdr , sizeof ( hdr ) );
1280
1293
if ( fd_alloc_hdr_sizeclass ( hdr ) == sizeclass &&
1281
1294
fd_alloc_hdr_block_idx ( hdr ) == block_idx &&
1282
1295
fd_alloc_hdr_superblock ( hdr , laddr_est )== superblock ) {
@@ -1286,6 +1299,7 @@ fd_alloc_superblock_fprintf( fd_wksp_t * wksp, /* non-NULL */
1286
1299
ctr [1 ]++ ;
1287
1300
break ;
1288
1301
}
1302
+ fd_msan_poison ( & hdr , sizeof ( hdr ) );
1289
1303
1290
1304
align_est >>= 1 ;
1291
1305
if ( FD_UNLIKELY ( !align_est ) ) {
0 commit comments