Verified Commit 1cec2a2f authored by Iain Ireland's avatar Iain Ireland Committed by ma1
Browse files

Bug 2058626: Check for mutually exclusive flags when deserializing cloned...

Bug 2058626: Check for mutually exclusive flags when deserializing cloned RegExp r=spidermonkey-reviewers,jonco

Differential Revision: https://phabricator.services.mozilla.com/D316904
parent 9cf002cf
Loading
Loading
Loading
Loading
+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 {}
+3 −1
Original line number Diff line number Diff line
@@ -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;