summaryrefslogtreecommitdiffstats
path: root/js/src/fuzz-tests/gluesmith
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
commit36d22d82aa202bb199967e9512281e9a53db42c9 (patch)
tree105e8c98ddea1c1e4784a60a5a6410fa416be2de /js/src/fuzz-tests/gluesmith
parentInitial commit. (diff)
downloadfirefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz
firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'js/src/fuzz-tests/gluesmith')
-rw-r--r--js/src/fuzz-tests/gluesmith/Cargo.toml10
-rw-r--r--js/src/fuzz-tests/gluesmith/moz.build15
-rw-r--r--js/src/fuzz-tests/gluesmith/src/lib.rs75
3 files changed, 100 insertions, 0 deletions
diff --git a/js/src/fuzz-tests/gluesmith/Cargo.toml b/js/src/fuzz-tests/gluesmith/Cargo.toml
new file mode 100644
index 0000000000..42c8cec4f2
--- /dev/null
+++ b/js/src/fuzz-tests/gluesmith/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "gluesmith"
+version = "0.1.0"
+authors = ["Christian Holler"]
+license = "MPL-2.0"
+
+[dependencies]
+wasm-smith = "0.12.5"
+arbitrary = { version = "1.0.0", features = ["derive"] }
+libc = "0.2"
diff --git a/js/src/fuzz-tests/gluesmith/moz.build b/js/src/fuzz-tests/gluesmith/moz.build
new file mode 100644
index 0000000000..d75c4c18ba
--- /dev/null
+++ b/js/src/fuzz-tests/gluesmith/moz.build
@@ -0,0 +1,15 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+FINAL_LIBRARY = "js"
+
+# Includes should be relative to parent path
+LOCAL_INCLUDES += ["!../..", "../.."]
+
+include("../../js-config.mozbuild")
+include("../../js-cxxflags.mozbuild")
+
+DIRS += ["../../rust"]
diff --git a/js/src/fuzz-tests/gluesmith/src/lib.rs b/js/src/fuzz-tests/gluesmith/src/lib.rs
new file mode 100644
index 0000000000..2efb678a03
--- /dev/null
+++ b/js/src/fuzz-tests/gluesmith/src/lib.rs
@@ -0,0 +1,75 @@
+/* Copyright 2021 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+extern crate arbitrary;
+extern crate wasm_smith;
+
+use arbitrary::{Arbitrary, Unstructured};
+use wasm_smith::{Config, Module};
+
+use std::ptr;
+
+// A custom configuration to enable all experimental features that we have
+// some support for.
+#[derive(Arbitrary, Debug)]
+struct SpiderMonkeyConfig;
+
+impl Config for SpiderMonkeyConfig {
+ fn bulk_memory_enabled(&self) -> bool {
+ true
+ }
+ fn reference_types_enabled(&self) -> bool {
+ true
+ }
+ fn exceptions_enabled(&self) -> bool {
+ true
+ }
+ fn memory64_enabled(&self) -> bool {
+ true
+ }
+ fn simd_enabled(&self) -> bool {
+ true
+ }
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn gluesmith(
+ data: *mut u8,
+ len: usize,
+ out: *mut u8,
+ maxlen: usize,
+) -> usize {
+ let buf: &[u8] = std::slice::from_raw_parts(data, len);
+
+ let mut u = Unstructured::new(buf);
+
+ let module = match Module::new(SpiderMonkeyConfig {}, &mut u) {
+ Ok(m) => m,
+ Err(_e) => return 0,
+ };
+
+ let wasm_bytes = module.to_bytes();
+
+ let src_len = wasm_bytes.len();
+
+ if src_len > maxlen {
+ return 0;
+ }
+
+ let src_ptr = wasm_bytes.as_ptr();
+ ptr::copy_nonoverlapping(src_ptr, out, src_len);
+
+ return src_len;
+}