tor-browser

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

litmus12.js (1513B)


      1 // Basically try to assert that the instance is restored properly when
      2 // performing an import call.  We do this by accessing the instance once we get
      3 // out of the tail call chain.
      4 
      5 // In this pure form, this test can't test for stack overflow as we can't do a loop of
      6 // imported functions without return_call_indirect and a table.
      7 
      8 // TODO: Probably add a loop here with an indirect call
      9 // TODO: More ballast will make it more likely that stack smashing is detected
     10 
     11 var insh = wasmEvalText(`
     12 (module
     13  (global $glob (export "glob") (mut i32) (i32.const 12345678))
     14  (func $h (export "h") (param i32) (result i32)
     15    (local.get 0)))`);
     16 
     17 var insg = wasmEvalText(`
     18 (module
     19  (import "insh" "h" (func $h (param i32) (result i32)))
     20  (global $glob (export "glob") (mut i32) (i32.const 24680246))
     21  (func $g (export "g") (param i32) (result i32)
     22    (return_call $h (local.get 0))))`, {insh:insh.exports});
     23 
     24 var insf = wasmEvalText(`
     25 (module
     26  (import "insg" "g" (func $g (param i32) (result i32)))
     27  (global $glob (export "glob") (mut i32) (i32.const 36903690))
     28  (func $f (export "f") (param i32) (result i32)
     29    (return_call $g (local.get 0))))`, {insg:insg.exports});
     30 
     31 var start = wasmEvalText(`
     32 (module
     33  (import "insf" "f" (func $f (param i32) (result i32)))
     34  (global $glob (export "glob") (mut i32) (i32.const 480480480))
     35  (func (export "run") (param i32) (result i32)
     36    (i32.add (call $f (local.get 0)) (global.get $glob))))`, {insf:insf.exports});
     37 
     38 assertEq(start.exports.run(37), 480480480 + 37);