/* -*- Mode: javascript; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ // This function can be used to "sanitize" a new global for fuzzing in such // a way that permanent side-effects, hangs and behavior that could be harmful // to libFuzzer targets is reduced to a minimum. function sanitizeGlobal(g) { let lfFuncs = { // Noisy functions (output) backtrace: function() {}, getBacktrace: function() {}, help: function() {}, print: function(s) { return s.toString(); }, printErr: function(s) { return s.toString(); }, putstr: function(s) { return s.toString(); }, stackDump: function() {}, dumpHeap: function() {}, dumpScopeChain: function() {}, dumpObjectWrappers: function() {}, dumpGCArenaInfo: function() {}, printProfilerEvents: function() {}, // Harmful functions (hangs, timeouts, leaks) getLcovInfo: function() {}, readline: function() {}, readlineBuf: function() {}, timeout: function() {}, quit: function() {}, interruptIf: function() {}, terminate: function() {}, invokeInterruptCallback: function() {}, setInterruptCallback: function() {}, intern: function() {}, evalInWorker: function() {}, sleep: function() {}, cacheEntry: function() {}, streamCacheEntry: function() {}, createMappedArrayBuffer: function() {}, wasmCompileInSeparateProcess: function() {}, gcparam: function() {}, newGlobal: function() { return g; }, // Harmful functions (throw) assertEq: function(a,b) { return a.toString() == b.toString(); }, throwError: function() {}, reportOutOfMemory: function() {}, throwOutOfMemory: function() {}, reportLargeAllocationFailure: function() {}, // Functions that need limiting gczeal: function(m, f) { return gczeal(m, 100); }, startgc: function(n, o) { startgc(n > 20 ? 20 : n, o); }, gcslice: function(n) { gcslice(n > 20 ? 20 : n); }, // Global side-effects deterministicgc: function() {}, fullcompartmentchecks: function() {}, setIonCheckGraphCoherency: function() {}, enableShellAllocationMetadataBuilder: function() {}, setTimeResolution: function() {}, options: function() { return "tracejit,methodjit,typeinfer"; }, setJitCompilerOption: function() {}, clearLastWarning: function() {}, enableSingleStepProfiling: function() {}, disableSingleStepProfiling: function() {}, enableGeckoProfiling: function() {}, enableGeckoProfilingWithSlowAssertions: function() {}, disableGeckoProfiling: function() {}, enqueueJob: function() {}, globalOfFirstJobInQueue: function() {}, drainJobQueue: function() {}, setPromiseRejectionTrackerCallback: function() {}, startTimingMutator: function() {}, stopTimingMutator: function() {}, setModuleLoadHook: function() {}, // Left enabled, as it is required for now to avoid leaks //setModuleResolveHook: function() {}, setModuleMetadataHook: function() {}, setModuleDynamicImportHook: function() {}, finishDynamicModuleImport: function() {}, abortDynamicModuleImport: function() {}, offThreadCompileScript: function() {}, runOffThreadScript: function() {}, offThreadCompileModule: function() {}, finishOffThreadModule: function() {}, offThreadDecodeScript: function() {}, runOffThreadDecodedScript: function() {}, addPromiseReactions: function() {}, ignoreUnhandledRejections: function() {}, enableTrackAllocations: function() {}, disableTrackAllocations: function() {}, startTraceLogger: function() {}, stopTraceLogger: function() {}, setTestFilenameValidationCallback: function() {}, }; for (let lfFunc in lfFuncs) { g[lfFunc] = lfFuncs[lfFunc]; } return g; }