Skip to content

Commit 33a7141

Browse files
tilgovirnewson
authored andcommitted
use fresh sandbox for every compile
1 parent 3841aed commit 33a7141

File tree

4 files changed

+45
-64
lines changed

4 files changed

+45
-64
lines changed

share/server/filter.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,9 @@ var Filter = (function() {
2929
},
3030
filter_view : function(fun, ddoc, args) {
3131
// recompile
32+
var sandbox = create_filter_sandbox();
3233
var source = fun.toSource ? fun.toSource() : '(' + fun.toString() + ')';
33-
fun = evalcx(source, filter_sandbox);
34+
fun = evalcx(source, sandbox);
3435

3536
var results = [];
3637
var docs = args[0];

share/server/loop.js

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,10 @@
1010
// License for the specific language governing permissions and limitations under
1111
// the License.
1212

13-
var sandbox = null;
14-
var filter_sandbox = null;
15-
16-
function init_sandbox() {
13+
function create_sandbox() {
1714
try {
1815
// if possible, use evalcx (not always available)
19-
sandbox = evalcx('');
16+
var sandbox = evalcx('');
2017
sandbox.emit = Views.emit;
2118
sandbox.sum = Views.sum;
2219
sandbox.log = log;
@@ -29,27 +26,17 @@ function init_sandbox() {
2926
sandbox.getRow = Render.getRow;
3027
sandbox.isArray = isArray;
3128
} catch (e) {
32-
//log(e.toSource());
29+
var sandbox = {};
3330
}
31+
return sandbox;
3432
};
35-
init_sandbox();
3633

37-
function init_filter_sandbox() {
38-
try {
39-
filter_sandbox = evalcx('');
40-
for (var p in sandbox) {
41-
if (sandbox.hasOwnProperty(p)) {
42-
filter_sandbox[p] = sandbox[p];
43-
}
44-
}
45-
filter_sandbox.emit = Filter.emit;
46-
} catch(e) {
47-
log(e.toSource ? e.toSource() : e.stack);
48-
}
34+
function create_filter_sandbox() {
35+
var sandbox = create_sandbox();
36+
sandbox.emit = Filter.emit;
37+
return sandbox;
4938
};
5039

51-
init_filter_sandbox();
52-
5340
// Commands are in the form of json arrays:
5441
// ["commandname",..optional args...]\n
5542
//

share/server/state.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ var State = {
1616
State.funs = [];
1717
State.lib = null;
1818
State.query_config = config || {};
19-
init_sandbox();
2019
gc();
2120
print("true"); // indicates success
2221
},

share/server/util.js

Lines changed: 35 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -61,52 +61,46 @@ var Couch = {
6161
compileFunction : function(source, ddoc, name) {
6262
if (!source) throw(["error","not_found","missing function"]);
6363

64-
var evaluate_function_source = function(source, evalFunction, sandbox) {
65-
sandbox = sandbox || {};
66-
if(typeof CoffeeScript === "undefined") {
67-
return evalFunction(source, sandbox, name);
68-
} else {
69-
var coffee = CoffeeScript.compile(source, {bare: true});
70-
return evalFunction(coffee, sandbox, name);
64+
var functionObject = null;
65+
var sandbox = create_sandbox();
66+
67+
var require = function(name, module) {
68+
module = module || {};
69+
var newModule = resolveModule(name.split('/'), module.parent, ddoc);
70+
if (!ddoc._module_cache.hasOwnProperty(newModule.id)) {
71+
// create empty exports object before executing the module,
72+
// stops circular requires from filling the stack
73+
ddoc._module_cache[newModule.id] = {};
74+
var s = "function (module, exports, require) { " + newModule.current + "\n }";
75+
try {
76+
var func = sandbox ? evalcx(s, sandbox, newModule.id) : eval(s);
77+
func.apply(sandbox, [newModule, newModule.exports, function(name) {
78+
return require(name, newModule);
79+
}]);
80+
} catch(e) {
81+
throw [
82+
"error",
83+
"compilation_error",
84+
"Module require('" +name+ "') raised error " +
85+
(e.toSource ? e.toSource() : e.stack)
86+
];
87+
}
88+
ddoc._module_cache[newModule.id] = newModule.exports;
7189
}
90+
return ddoc._module_cache[newModule.id];
91+
};
92+
93+
if (ddoc) {
94+
sandbox.require = require;
95+
if (!ddoc._module_cache) ddoc._module_cache = {};
7296
}
7397

7498
try {
75-
if (sandbox) {
76-
if (ddoc) {
77-
if (!ddoc._module_cache) {
78-
ddoc._module_cache = {};
79-
}
80-
var require = function(name, module) {
81-
module = module || {};
82-
var newModule = resolveModule(name.split('/'), module.parent, ddoc);
83-
if (!ddoc._module_cache.hasOwnProperty(newModule.id)) {
84-
// create empty exports object before executing the module,
85-
// stops circular requires from filling the stack
86-
ddoc._module_cache[newModule.id] = {};
87-
var s = "function (module, exports, require) { " + newModule.current + "\n }";
88-
try {
89-
var func = sandbox ? evalcx(s, sandbox, newModule.id) : eval(s);
90-
func.apply(sandbox, [newModule, newModule.exports, function(name) {
91-
return require(name, newModule);
92-
}]);
93-
} catch(e) {
94-
throw [
95-
"error",
96-
"compilation_error",
97-
"Module require('" +name+ "') raised error " +
98-
(e.toSource ? e.toSource() : e.stack)
99-
];
100-
}
101-
ddoc._module_cache[newModule.id] = newModule.exports;
102-
}
103-
return ddoc._module_cache[newModule.id];
104-
};
105-
sandbox.require = require;
106-
}
107-
var functionObject = evaluate_function_source(source, evalcx, sandbox);
99+
if(typeof CoffeeScript === "undefined") {
100+
functionObject = evalcx(source, sandbox, name);
108101
} else {
109-
var functionObject = evaluate_function_source(source, eval);
102+
var transpiled = CoffeeScript.compile(source, {bare: true});
103+
functionObject = evalcx(transpiled, sandbox, name);
110104
}
111105
} catch (err) {
112106
throw([

0 commit comments

Comments
 (0)