tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

cross-compartment-nukeccw.js (4431B)


      1 load(libdir + "asserts.js");
      2 
      3 const otherGlobal = newGlobal({newCompartment: true});
      4 
      5 function nukeValue(wrapper, value) {
      6  return {
      7    valueOf() {
      8      nukeCCW(wrapper);
      9      return value;
     10    }
     11  };
     12 };
     13 
     14 function assertIsDeadWrapper(value) {
     15  assertTypeErrorMessage(() => value.foo, "can't access dead object");
     16 }
     17 
     18 // Atomics.load
     19 {
     20  let sab = new otherGlobal.SharedArrayBuffer(4);
     21  let ta = new otherGlobal.Int32Array(sab);
     22  ta[0] = 1;
     23 
     24  let val = Atomics.load(ta, nukeValue(ta, 0));
     25 
     26  assertEq(val, 1);
     27  assertIsDeadWrapper(ta);
     28 }
     29 {
     30  let sab = new otherGlobal.SharedArrayBuffer(4);
     31  let ta = new otherGlobal.Int32Array(sab);
     32  ta[0] = 1;
     33 
     34  let val = Atomics.load(ta, nukeValue(sab, 0));
     35 
     36  assertEq(val, 1);
     37  assertEq(ta[0], 1);
     38  assertIsDeadWrapper(sab);
     39 }
     40 
     41 // Atomics.store
     42 {
     43  let sab = new otherGlobal.SharedArrayBuffer(4);
     44  let ta = new otherGlobal.Int32Array(sab);
     45 
     46  Atomics.store(ta, 0, nukeValue(ta, 1));
     47 
     48  assertIsDeadWrapper(ta);
     49 }
     50 {
     51  let sab = new otherGlobal.SharedArrayBuffer(4);
     52  let ta = new otherGlobal.Int32Array(sab);
     53 
     54  Atomics.store(ta, 0, nukeValue(sab, 1));
     55 
     56  assertEq(ta[0], 1);
     57  assertIsDeadWrapper(sab);
     58 }
     59 
     60 // Atomics.compareExchange
     61 {
     62  let sab = new otherGlobal.SharedArrayBuffer(4);
     63  let ta = new otherGlobal.Int32Array(sab);
     64  ta[0] = 1;
     65 
     66  let val = Atomics.compareExchange(ta, 0, 1, nukeValue(ta, 2));
     67 
     68  assertEq(val, 1);
     69  assertIsDeadWrapper(ta);
     70 }
     71 {
     72  let sab = new otherGlobal.SharedArrayBuffer(4);
     73  let ta = new otherGlobal.Int32Array(sab);
     74  ta[0] = 1;
     75 
     76  let val = Atomics.compareExchange(ta, 0, 1, nukeValue(sab, 2));
     77 
     78  assertEq(val, 1);
     79  assertEq(ta[0], 2);
     80  assertIsDeadWrapper(sab);
     81 }
     82 
     83 // Atomics.exchange
     84 {
     85  let sab = new otherGlobal.SharedArrayBuffer(4);
     86  let ta = new otherGlobal.Int32Array(sab);
     87  ta[0] = 1;
     88 
     89  let val = Atomics.exchange(ta, 0, nukeValue(ta, 2));
     90 
     91  assertEq(val, 1);
     92  assertIsDeadWrapper(ta);
     93 }
     94 {
     95  let sab = new otherGlobal.SharedArrayBuffer(4);
     96  let ta = new otherGlobal.Int32Array(sab);
     97  ta[0] = 1;
     98 
     99  let val = Atomics.exchange(ta, 0, nukeValue(sab, 2));
    100 
    101  assertEq(val, 1);
    102  assertEq(ta[0], 2);
    103  assertIsDeadWrapper(sab);
    104 }
    105 
    106 // Atomics.add
    107 {
    108  let sab = new otherGlobal.SharedArrayBuffer(4);
    109  let ta = new otherGlobal.Int32Array(sab);
    110  ta[0] = 1;
    111 
    112  let val = Atomics.add(ta, 0, nukeValue(ta, 2));
    113 
    114  assertEq(val, 1);
    115  assertIsDeadWrapper(ta);
    116 }
    117 {
    118  let sab = new otherGlobal.SharedArrayBuffer(4);
    119  let ta = new otherGlobal.Int32Array(sab);
    120  ta[0] = 1;
    121 
    122  let val = Atomics.add(ta, 0, nukeValue(sab, 2));
    123 
    124  assertEq(val, 1);
    125  assertEq(ta[0], 3);
    126  assertIsDeadWrapper(sab);
    127 }
    128 
    129 // Atomics.sub
    130 {
    131  let sab = new otherGlobal.SharedArrayBuffer(4);
    132  let ta = new otherGlobal.Int32Array(sab);
    133  ta[0] = 3;
    134 
    135  let val = Atomics.sub(ta, 0, nukeValue(ta, 2));
    136 
    137  assertEq(val, 3);
    138  assertIsDeadWrapper(ta);
    139 }
    140 {
    141  let sab = new otherGlobal.SharedArrayBuffer(4);
    142  let ta = new otherGlobal.Int32Array(sab);
    143  ta[0] = 3;
    144 
    145  let val = Atomics.sub(ta, 0, nukeValue(sab, 2));
    146 
    147  assertEq(val, 3);
    148  assertEq(ta[0], 1);
    149  assertIsDeadWrapper(sab);
    150 }
    151 
    152 // Atomics.and
    153 {
    154  let sab = new otherGlobal.SharedArrayBuffer(4);
    155  let ta = new otherGlobal.Int32Array(sab);
    156  ta[0] = 3;
    157 
    158  let val = Atomics.and(ta, 0, nukeValue(ta, 1));
    159 
    160  assertEq(val, 3);
    161  assertIsDeadWrapper(ta);
    162 }
    163 {
    164  let sab = new otherGlobal.SharedArrayBuffer(4);
    165  let ta = new otherGlobal.Int32Array(sab);
    166  ta[0] = 3;
    167 
    168  let val = Atomics.and(ta, 0, nukeValue(sab, 1));
    169 
    170  assertEq(val, 3);
    171  assertEq(ta[0], 1);
    172  assertIsDeadWrapper(sab);
    173 }
    174 
    175 // Atomics.or
    176 {
    177  let sab = new otherGlobal.SharedArrayBuffer(4);
    178  let ta = new otherGlobal.Int32Array(sab);
    179  ta[0] = 2;
    180 
    181  let val = Atomics.or(ta, 0, nukeValue(ta, 1));
    182 
    183  assertEq(val, 2);
    184  assertIsDeadWrapper(ta);
    185 }
    186 {
    187  let sab = new otherGlobal.SharedArrayBuffer(4);
    188  let ta = new otherGlobal.Int32Array(sab);
    189  ta[0] = 2;
    190 
    191  let val = Atomics.or(ta, 0, nukeValue(sab, 1));
    192 
    193  assertEq(val, 2);
    194  assertEq(ta[0], 3);
    195  assertIsDeadWrapper(sab);
    196 }
    197 
    198 // Atomics.xor
    199 {
    200  let sab = new otherGlobal.SharedArrayBuffer(4);
    201  let ta = new otherGlobal.Int32Array(sab);
    202  ta[0] = 3;
    203 
    204  let val = Atomics.xor(ta, 0, nukeValue(ta, 1));
    205 
    206  assertEq(val, 3);
    207  assertIsDeadWrapper(ta);
    208 }
    209 {
    210  let sab = new otherGlobal.SharedArrayBuffer(4);
    211  let ta = new otherGlobal.Int32Array(sab);
    212  ta[0] = 3;
    213 
    214  let val = Atomics.xor(ta, 0, nukeValue(sab, 1));
    215 
    216  assertEq(val, 3);
    217  assertEq(ta[0], 2);
    218  assertIsDeadWrapper(sab);
    219 }