mirror of https://github.com/lukechilds/node.git
Browse Source
This fixes a race condition in the watchdog timer used for vm timeouts. The condition would terminate the main stack's execution instead of the code running under the sandbox. PR-URL: https://github.com/nodejs/node/pull/13074 Reviewed-By: Anna Henningsen <anna@addaleax.net>v6
Marcel Laverdet
8 years ago
committed by
Anna Henningsen
4 changed files with 63 additions and 73 deletions
@ -0,0 +1,33 @@ |
|||
'use strict'; |
|||
require('../common'); |
|||
const vm = require('vm'); |
|||
|
|||
// We're testing a race condition so we just have to spin this in a loop
|
|||
// for a little while and see if it breaks. The condition being tested
|
|||
// is an `isolate->TerminateExecution()` reaching the main JS stack from
|
|||
// the timeout watchdog.
|
|||
const sandbox = { timeout: 5 }; |
|||
const context = vm.createContext(sandbox); |
|||
const script = new vm.Script( |
|||
'var d = Date.now() + timeout;while (d > Date.now());' |
|||
); |
|||
const immediate = setImmediate(function() { |
|||
throw new Error('Detected vm race condition!'); |
|||
}); |
|||
|
|||
// When this condition was first discovered this test would fail in 50ms
|
|||
// or so. A better, but still incorrect implementation would fail after
|
|||
// 100 seconds or so. If you're messing with vm timeouts you might
|
|||
// consider increasing this timeout to hammer out races.
|
|||
const giveUp = Date.now() + 5000; |
|||
do { |
|||
// The loop adjusts the timeout up or down trying to hit the race
|
|||
try { |
|||
script.runInContext(context, { timeout: 5 }); |
|||
++sandbox.timeout; |
|||
} catch (err) { |
|||
--sandbox.timeout; |
|||
} |
|||
} while (Date.now() < giveUp); |
|||
|
|||
clearImmediate(immediate); |
Loading…
Reference in new issue