@@ -89,6 +89,8 @@ pub struct FuzzerOptions {
89
89
args : Vec < String > ,
90
90
}
91
91
92
+ pub const MAX_INPUT_SIZE : usize = 1048576 ; // 1MB
93
+
92
94
pub fn fuzz ( ) {
93
95
let mut options = FuzzerOptions :: parse ( ) ;
94
96
@@ -105,10 +107,10 @@ pub fn fuzz() {
105
107
let files_per_core = ( num_files as f64 / num_cores as f64 ) . ceil ( ) as usize ;
106
108
107
109
let program = env:: args ( ) . next ( ) . unwrap ( ) ;
108
- println ! ( "Program: {program:}" ) ;
110
+ log :: debug !( "Program: {program:}" ) ;
109
111
110
112
options. args . insert ( 0 , program) ;
111
- println ! ( "ARGS: {:#?}" , options. args) ;
113
+ log :: debug !( "ARGS: {:#?}" , options. args) ;
112
114
113
115
env:: remove_var ( "LD_LIBRARY_PATH" ) ;
114
116
let env: Vec < ( String , String ) > = env:: vars ( ) . collect ( ) ;
@@ -120,13 +122,12 @@ pub fn fuzz() {
120
122
let test_one_input_ptr = elf
121
123
. resolve_symbol ( "LLVMFuzzerTestOneInput" , emu. load_addr ( ) )
122
124
. expect ( "Symbol LLVMFuzzerTestOneInput not found" ) ;
123
- println ! ( "LLVMFuzzerTestOneInput @ {test_one_input_ptr:#x}" ) ;
125
+ log :: debug !( "LLVMFuzzerTestOneInput @ {test_one_input_ptr:#x}" ) ;
124
126
125
- emu. set_breakpoint ( test_one_input_ptr) ;
126
- unsafe { emu. run ( ) } ;
127
+ emu. entry_break ( test_one_input_ptr) ;
127
128
128
129
for m in emu. mappings ( ) {
129
- println ! (
130
+ log :: debug !(
130
131
"Mapping: 0x{:016x}-0x{:016x}, {}" ,
131
132
m. start( ) ,
132
133
m. end( ) ,
@@ -135,16 +136,17 @@ pub fn fuzz() {
135
136
}
136
137
137
138
let pc: GuestReg = emu. read_reg ( Regs :: Pc ) . unwrap ( ) ;
138
- println ! ( "Break at {pc:#x}" ) ;
139
+ log :: debug !( "Break at {pc:#x}" ) ;
139
140
140
141
let ret_addr: GuestAddr = emu. read_return_address ( ) . unwrap ( ) ;
141
- println ! ( "Return address = {ret_addr:#x}" ) ;
142
+ log :: debug !( "Return address = {ret_addr:#x}" ) ;
142
143
143
- emu. remove_breakpoint ( test_one_input_ptr) ;
144
144
emu. set_breakpoint ( ret_addr) ;
145
145
146
- let input_addr = emu. map_private ( 0 , 4096 , MmapPerms :: ReadWrite ) . unwrap ( ) ;
147
- println ! ( "Placing input at {input_addr:#x}" ) ;
146
+ let input_addr = emu
147
+ . map_private ( 0 , MAX_INPUT_SIZE , MmapPerms :: ReadWrite )
148
+ . unwrap ( ) ;
149
+ log:: debug!( "Placing input at {input_addr:#x}" ) ;
148
150
149
151
let stack_ptr: GuestAddr = emu. read_reg ( Regs :: Sp ) . unwrap ( ) ;
150
152
@@ -163,12 +165,13 @@ pub fn fuzz() {
163
165
164
166
let mut harness = |input : & BytesInput | {
165
167
let target = input. target_bytes ( ) ;
166
- let buf = target
167
- . as_slice ( )
168
- . chunks ( 4096 )
169
- . next ( )
170
- . expect ( "Failed to get chunk" ) ;
171
- let len = buf. len ( ) as GuestReg ;
168
+ let mut buf = target. as_slice ( ) ;
169
+ let mut len = buf. len ( ) ;
170
+ if len > MAX_INPUT_SIZE {
171
+ buf = & buf[ 0 ..MAX_INPUT_SIZE ] ;
172
+ len = MAX_INPUT_SIZE ;
173
+ }
174
+ let len = len as GuestReg ;
172
175
reset ( buf, len) . unwrap ( ) ;
173
176
ExitKind :: Ok
174
177
} ;
@@ -226,12 +229,18 @@ pub fn fuzz() {
226
229
} ,
227
230
) ;
228
231
232
+ let mut coverage = PathBuf :: from ( & options. coverage ) ;
233
+ let coverage_name = coverage. file_stem ( ) . unwrap ( ) . to_str ( ) . unwrap ( ) ;
234
+ let coverage_extension = coverage. extension ( ) . unwrap_or_default ( ) . to_str ( ) . unwrap ( ) ;
235
+ let core = core_id. 0 ;
236
+ coverage. set_file_name ( format ! ( "{coverage_name}-{core:03}.{coverage_extension}" ) ) ;
237
+
229
238
let mut hooks = QemuHooks :: new (
230
239
& emu,
231
240
tuple_list ! ( QemuDrCovHelper :: new(
232
241
QemuInstrumentationFilter :: None ,
233
242
rangemap,
234
- PathBuf :: from( & options . coverage) ,
243
+ PathBuf :: from( coverage) ,
235
244
false ,
236
245
) ) ,
237
246
) ;
@@ -255,10 +264,10 @@ pub fn fuzz() {
255
264
println ! ( "Failed to load initial corpus at {:?}" , & corpus_dir) ;
256
265
process:: exit ( 0 ) ;
257
266
} ) ;
258
- println ! ( "We imported {} inputs from disk." , state. corpus( ) . count( ) ) ;
267
+ log :: debug !( "We imported {} inputs from disk." , state. corpus( ) . count( ) ) ;
259
268
}
260
269
261
- println ! ( "Processed {} inputs from disk." , files. len( ) ) ;
270
+ log :: debug !( "Processed {} inputs from disk." , files. len( ) ) ;
262
271
263
272
mgr. send_exiting ( ) ?;
264
273
Err ( Error :: ShuttingDown ) ?
0 commit comments