@@ -27,12 +27,12 @@ class FuzzerCorn {
27
27
bool IsFuzzing () { return this ->IsFuzzing_ ; }
28
28
29
29
FuzzerCornError
30
- Fuzz (uc_engine *Uc, int *Argc, char ***Argv,
31
- FuzzerCornPlaceInputCallback Input, FuzzerCornInitialize Init ,
32
- FuzzerCornValidateCallback Validate, FuzzerCornMutatorCallback Mutate ,
33
- FuzzerCornCrossOverCallback Cross, InstrumentRange *Ranges ,
34
- size_t RangeCount, void *UserData, bool AlwaysValidate, int *ExitCode ,
35
- size_t CounterCount) {
30
+ Fuzz (uc_engine *Uc, int *Argc, char ***Argv, uint64_t *Exits,
31
+ size_t ExitCount, FuzzerCornPlaceInputCallback Input ,
32
+ FuzzerCornInitialize Init, FuzzerCornValidateCallback Validate ,
33
+ FuzzerCornMutatorCallback Mutate, FuzzerCornCrossOverCallback Cross ,
34
+ InstrumentRange *Ranges, size_t RangeCount, void *UserData ,
35
+ bool AlwaysValidate, int *ExitCode, size_t CounterCount) {
36
36
InitializeCallback InitCb = Init ? InitializeCallbackWrapper_ : nullptr ;
37
37
CustomMutatorCallback MutCb = Mutate ? MutateCallbackWrapper_ : nullptr ;
38
38
CustomCrossOverCallback CrossCb =
@@ -51,6 +51,8 @@ class FuzzerCorn {
51
51
this ->PrevLoc_ = 0 ;
52
52
this ->Ranges_ = Ranges_;
53
53
this ->RangeCount_ = RangeCount;
54
+ this ->Exits_ = Exits;
55
+ this ->ExitCount_ = ExitCount_;
54
56
55
57
*ExitCode = LLVMFuzzerRunDriver (
56
58
Argc, Argv, TestOneInputCallbackWrapper_, InitCb, MutCb, CrossCb,
@@ -226,6 +228,23 @@ class FuzzerCorn {
226
228
// In the fork mode:
227
229
// TODO!
228
230
231
+ if (this ->ExitCount_ == 0 ) {
232
+ return FUZZERCORN_ERR_OK;
233
+ }
234
+
235
+ // Enable multiple exits.
236
+ Err = uc_ctl_exits_enable (this ->Uc_ );
237
+ if (unlikely (Err)) {
238
+ return FUZZERCORN_ERR_UC_ERR;
239
+ }
240
+
241
+ // Setup exits.
242
+ V.assign (this ->Exits_ , this ->Exits_ + this ->ExitCount_ );
243
+ Err = uc_ctl_set_exits (this ->Uc_ , (uint64_t *)&V[0 ], this ->ExitCount_ );
244
+ if (unlikely (Err)) {
245
+ return FUZZERCORN_ERR_UC_ERR;
246
+ }
247
+
229
248
return FUZZERCORN_ERR_OK;
230
249
}
231
250
@@ -237,6 +256,8 @@ class FuzzerCorn {
237
256
void *UserData_;
238
257
InstrumentRange *Ranges_;
239
258
size_t RangeCount_;
259
+ uint64_t *Exits_;
260
+ size_t ExitCount_;
240
261
uc_engine *Uc_;
241
262
FuzzerCornInitialize Init_;
242
263
FuzzerCornPlaceInputCallback Input_;
@@ -252,12 +273,14 @@ class FuzzerCorn {
252
273
253
274
FuzzerCorn FuzzerCorn::fuzzer;
254
275
255
- FuzzerCornError FuzzerCornFuzz (
256
- uc_engine *Uc, int *Argc, char ***Argv, FuzzerCornPlaceInputCallback Input,
257
- FuzzerCornInitialize Init, FuzzerCornValidateCallback Validate,
258
- FuzzerCornMutatorCallback Mutate, FuzzerCornCrossOverCallback Cross,
259
- InstrumentRange *Ranges, size_t RangeCount, void *UserData,
260
- bool AlwaysValidate, int *ExitCode, size_t CounterCount) {
276
+ FuzzerCornError
277
+ FuzzerCornFuzz (uc_engine *Uc, int *Argc, char ***Argv, uint64_t *Exits,
278
+ size_t ExitCount, FuzzerCornPlaceInputCallback Input,
279
+ FuzzerCornInitialize Init, FuzzerCornValidateCallback Validate,
280
+ FuzzerCornMutatorCallback Mutate,
281
+ FuzzerCornCrossOverCallback Cross, InstrumentRange *Ranges,
282
+ size_t RangeCount, void *UserData, bool AlwaysValidate,
283
+ int *ExitCode, size_t CounterCount) {
261
284
FuzzerCorn &fuzzer = FuzzerCorn::Get ();
262
285
263
286
if (unlikely (fuzzer.IsFuzzing ())) {
@@ -285,7 +308,7 @@ FuzzerCornError FuzzerCornFuzz(
285
308
return FUZZERCORN_ERR_ARG;
286
309
}
287
310
288
- return fuzzer.Fuzz (Uc, Argc, Argv, Input, Init, Validate, Mutate, Cross ,
289
- Ranges, RangeCount, UserData, AlwaysValidate, ExitCode ,
290
- CounterCount);
311
+ return fuzzer.Fuzz (Uc, Argc, Argv, Exits, ExitCount, Input, Init, Validate ,
312
+ Mutate, Cross, Ranges, RangeCount, UserData ,
313
+ AlwaysValidate, ExitCode, CounterCount);
291
314
}
0 commit comments