Line data Source code
1 : #if !FD_HAS_HOSTED 2 : #error "This target requires FD_HAS_HOSTED" 3 : #endif 4 : 5 : #include <stdio.h> 6 : #include <stdlib.h> 7 : 8 : #include "../../util/fd_util.h" 9 : #include "../../util/sanitize/fd_fuzz.h" 10 : #include "fd_tar.h" 11 : 12 : int 13 : LLVMFuzzerInitialize( int * argc, 14 18 : char *** argv ) { 15 : /* Set up shell without signal handlers */ 16 18 : putenv( "FD_LOG_BACKTRACE=0" ); 17 18 : fd_boot( argc, argv ); 18 18 : atexit( fd_halt ); 19 18 : fd_log_level_stderr_set(4); 20 18 : return 0; 21 18 : } 22 : 23 : static int 24 : tar_file( void * cb_arg, 25 : fd_tar_meta_t const * meta, 26 0 : ulong FD_FN_UNUSED sz ) { 27 0 : FD_TEST( (ulong)cb_arg == 0x1234UL ); 28 : 29 : /* Read meta to ensure it is accessible */ 30 0 : fd_tar_meta_t meta2; 31 0 : meta2 = *meta; 32 0 : void * meta_ptr = &meta2; 33 0 : FD_COMPILER_FORGET( meta_ptr ); 34 : 35 0 : return 0; 36 0 : } 37 : 38 : static int 39 : tar_read( void * cb_arg, 40 : void const * buf, 41 0 : ulong bufsz ) { 42 0 : FD_TEST( (ulong)cb_arg == 0x1234UL ); 43 : 44 : /* Read buf to ensure it is accessible */ 45 0 : int x = 0; 46 0 : for( ulong i=0UL; i<bufsz; i++ ) 47 0 : x ^= ((uchar const *)buf)[i]; 48 0 : FD_COMPILER_FORGET( x ); 49 : 50 0 : return 0; 51 0 : } 52 : 53 : static const fd_tar_read_vtable_t tar_read_vt = { 54 : .file = tar_file, 55 : .read = tar_read 56 : }; 57 : 58 : 59 : int 60 : LLVMFuzzerTestOneInput( uchar const * data, 61 : ulong size ) { 62 : 63 : fd_tar_reader_t _reader[1]; 64 : 65 : fd_tar_reader_t * reader = fd_tar_reader_new( _reader, &tar_read_vt, (void *)0x1234UL ); 66 : FD_TEST( reader ); 67 : 68 : /* Read all in one */ 69 : int err1 = fd_tar_read( reader, data, size ); 70 : 71 : FD_TEST( _reader==fd_tar_reader_delete( reader ) ); 72 : 73 : reader = fd_tar_reader_new( _reader, &tar_read_vt, (void *)0x1234UL ); 74 : FD_TEST( reader ); 75 : 76 : /* Read byte by byte */ 77 : int err2 = 0; 78 : for( ulong i=0UL; i<size; i++ ) { 79 : FD_FUZZ_MUST_BE_COVERED; 80 : err2 = fd_tar_read( reader, data+i, 1UL ); 81 : if( err2!=0 ) break; 82 : } 83 : 84 : FD_TEST( _reader==fd_tar_reader_delete( reader ) ); 85 : 86 : /* Errors should be the same */ 87 : if( FD_UNLIKELY( err1!=err2 ) ) 88 : FD_LOG_ERR(( "err1=%d err2=%d", err1, err2 )); 89 : 90 : FD_FUZZ_MUST_BE_COVERED; 91 : return 0; 92 : }