@@ -25,16 +25,16 @@ import * as reports from "istanbul-reports";
25
25
import * as fuzzer from "@jazzer.js/fuzzer" ;
26
26
import * as hooking from "@jazzer.js/hooking" ;
27
27
import {
28
- loadBugDetectors ,
28
+ clearFirstFinding ,
29
29
Finding ,
30
30
getFirstFinding ,
31
- clearFirstFinding ,
31
+ loadBugDetectors ,
32
32
} from "@jazzer.js/bug-detectors" ;
33
33
import {
34
- registerInstrumentor ,
35
- Instrumentor ,
36
34
FileSyncIdStrategy ,
35
+ Instrumentor ,
37
36
MemorySyncIdStrategy ,
37
+ registerInstrumentor ,
38
38
} from "@jazzer.js/instrumentor" ;
39
39
import { builtinModules } from "module" ;
40
40
@@ -404,40 +404,54 @@ export function wrapFuzzFunctionForBugDetection(
404
404
let result : void | Promise < void > ;
405
405
try {
406
406
result = ( originalFuzzFn as fuzzer . FuzzTargetAsyncOrValue ) ( data ) ;
407
+ // Explicitly handle Promises and, if none, return the result
408
+ // directly to still support sync fuzz targets.
409
+ if ( result instanceof Promise ) {
410
+ return result . then (
411
+ ( result ) => {
412
+ return throwIfError ( ) ?? result ;
413
+ } ,
414
+ ( reason ) => {
415
+ return throwIfError ( reason ) ;
416
+ }
417
+ ) ;
418
+ }
407
419
} catch ( e ) {
408
420
fuzzTargetError = e ;
409
421
}
410
- return handleErrors ( result , fuzzTargetError ) ;
422
+ return throwIfError ( fuzzTargetError ) ?? result ;
411
423
} ;
412
424
} else {
413
- return ( data : Buffer , done : ( err ?: Error ) => void ) : void => {
414
- let fuzzTargetError : unknown ;
425
+ return (
426
+ data : Buffer ,
427
+ done : ( err ?: Error ) => void
428
+ ) : void | Promise < void > => {
415
429
try {
416
- originalFuzzFn ( data , ( err ?: Error ) => {
430
+ // Return result of fuzz target to enable sanity checks in C++ part.
431
+ return originalFuzzFn ( data , ( err ?: Error ) => {
417
432
const finding = getFirstFinding ( ) ;
418
433
if ( finding !== undefined ) {
419
434
clearFirstFinding ( ) ;
420
435
}
421
436
done ( finding ?? err ) ;
422
437
} ) ;
423
438
} catch ( e ) {
424
- fuzzTargetError = e ;
439
+ throwIfError ( e ) ;
425
440
}
426
- handleErrors ( undefined , fuzzTargetError ) ;
427
441
} ;
428
442
}
429
443
}
430
444
431
- function handleErrors ( result : void | Promise < void > , fuzzTargetError : unknown ) {
445
+ function throwIfError ( fuzzTargetError ? : unknown ) {
432
446
const error = getFirstFinding ( ) ;
433
447
if ( error !== undefined ) {
434
448
// The `firstFinding` is a global variable: we need to clear it after each fuzzing iteration.
435
449
clearFirstFinding ( ) ;
436
450
throw error ;
437
- } else if ( fuzzTargetError !== undefined ) {
451
+ } else if ( fuzzTargetError ) {
438
452
throw fuzzTargetError ;
439
453
}
440
- return result ;
454
+ return undefined ;
441
455
}
442
456
443
457
async function importModule ( name : string ) : Promise < FuzzModule | void > {
0 commit comments