diff --git a/configure.py b/configure.py index eaa262be30d5d4..ff09f27f4d14af 100755 --- a/configure.py +++ b/configure.py @@ -392,6 +392,11 @@ dest='v8_options', help='v8 options to pass, see `node --v8-options` for examples.') +parser.add_option('--with-ossfuzz', + action='store_true', + dest='ossfuzz', + help='Enables building of fuzzers. This command should be run in an OSS-Fuzz Docker image.') + parser.add_option('--with-arm-float-abi', action='store', dest='arm_float_abi', @@ -1770,6 +1775,9 @@ def make_bin_override(): configure_static(output) configure_inspector(output) +# Forward OSS-Fuzz settings +output['variables']['ossfuzz'] = b(options.ossfuzz) + # variables should be a root level element, # move everything else to target_defaults variables = output['variables'] diff --git a/node.gyp b/node.gyp index d11d6703f647de..5521837a8a4d00 100644 --- a/node.gyp +++ b/node.gyp @@ -12,6 +12,7 @@ 'node_use_bundled_v8%': 'true', 'node_shared%': 'false', 'force_dynamic_crt%': 0, + 'ossfuzz' : 'false', 'node_module_version%': '', 'node_shared_brotli%': 'false', 'node_shared_zlib%': 'false', @@ -1125,6 +1126,38 @@ } ], ] }, # specialize_node_d + { # fuzz_url + 'target_name': 'fuzz_url', + 'type': 'executable', + 'dependencies': [ + '<(node_lib_target_name)', + ], + 'includes': [ + 'node.gypi' + ], + 'include_dirs': [ + 'src', + ], + 'defines': [ + 'NODE_ARCH="<(target_arch)"', + 'NODE_PLATFORM="<(OS)"', + 'NODE_WANT_INTERNALS=1', + ], + 'sources': [ + 'src/node_snapshot_stub.cc', + 'src/node_code_cache_stub.cc', + 'test/fuzzers/fuzz_url.cc', + ], + 'conditions': [ + ['OS=="linux"', { + 'ldflags': [ '-fsanitize=fuzzer' ] + }], + # Ensure that ossfuzz flag has been set and that we are on Linux + [ 'OS!="linux" or ossfuzz!="true"', { + 'type': 'none', + }], + ], + }, # fuzz_url { 'target_name': 'cctest', 'type': 'executable', diff --git a/test/fuzzers/fuzz_url.cc b/test/fuzzers/fuzz_url.cc new file mode 100644 index 00000000000000..16c5f644893f86 --- /dev/null +++ b/test/fuzzers/fuzz_url.cc @@ -0,0 +1,11 @@ +#include + +#include "node.h" +#include "node_internals.h" +#include "node_url.h" + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + node::url::URL url2(reinterpret_cast(data), size); + + return 0; +}