Loading js/src/jit-test/tests/structured-clone/bug2058626.js 0 → 100644 +16 −0 Original line number Diff line number Diff line function forge(pattern, srcFlags, flagsByte) { var cb = serialize(new RegExp(pattern, srcFlags), undefined, { scope: "DifferentProcess" }); var u8 = new Uint8Array(cb.arraybuffer); for (var i = 0; i + 8 <= u8.length; i += 4) { var tag = u8[i+4] | (u8[i+5] << 8) | (u8[i+6] << 16) | (u8[i+7] << 24); if ((tag >>> 0) === 0xFFFF0006) { u8[i] = flagsByte; break; } } cb.clonebuffer = u8.buffer; return deserialize(cb, { scope: "DifferentProcess" }); } try { var forged = forge("[\\q{abc|de}]", "v", 0x90); var bad = new RegExp(forged, "u"); try { bad.exec("abc"); } catch {} var good = new RegExp("[\\q{abc|de}]", "u"); } catch {} js/src/vm/StructuredClone.cpp +3 −1 Original line number Diff line number Diff line Loading @@ -3189,7 +3189,9 @@ bool JSStructuredCloneReader::startRead(MutableHandleValue vp, } case SCTAG_REGEXP_OBJECT: { if ((data & RegExpFlag::AllFlags) != data) { // Reject invalid flags. /u and /v are mutually exclusive. if ((data & RegExpFlag::AllFlags) != data || ((data & RegExpFlag::Unicode) && (data & RegExpFlag::UnicodeSets))) { JS_ReportErrorNumberASCII(context(), GetErrorMessage, nullptr, JSMSG_SC_BAD_SERIALIZED_DATA, "regexp"); return false; Loading Loading
js/src/jit-test/tests/structured-clone/bug2058626.js 0 → 100644 +16 −0 Original line number Diff line number Diff line function forge(pattern, srcFlags, flagsByte) { var cb = serialize(new RegExp(pattern, srcFlags), undefined, { scope: "DifferentProcess" }); var u8 = new Uint8Array(cb.arraybuffer); for (var i = 0; i + 8 <= u8.length; i += 4) { var tag = u8[i+4] | (u8[i+5] << 8) | (u8[i+6] << 16) | (u8[i+7] << 24); if ((tag >>> 0) === 0xFFFF0006) { u8[i] = flagsByte; break; } } cb.clonebuffer = u8.buffer; return deserialize(cb, { scope: "DifferentProcess" }); } try { var forged = forge("[\\q{abc|de}]", "v", 0x90); var bad = new RegExp(forged, "u"); try { bad.exec("abc"); } catch {} var good = new RegExp("[\\q{abc|de}]", "u"); } catch {}
js/src/vm/StructuredClone.cpp +3 −1 Original line number Diff line number Diff line Loading @@ -3189,7 +3189,9 @@ bool JSStructuredCloneReader::startRead(MutableHandleValue vp, } case SCTAG_REGEXP_OBJECT: { if ((data & RegExpFlag::AllFlags) != data) { // Reject invalid flags. /u and /v are mutually exclusive. if ((data & RegExpFlag::AllFlags) != data || ((data & RegExpFlag::Unicode) && (data & RegExpFlag::UnicodeSets))) { JS_ReportErrorNumberASCII(context(), GetErrorMessage, nullptr, JSMSG_SC_BAD_SERIALIZED_DATA, "regexp"); return false; Loading