From 7a9a112108d8c37f1c611985581f94ca106faea0 Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Sun, 9 Oct 2011 08:59:34 +0000
Subject: [PATCH] eval needs a global object as root... place this in a
 separate compartment.

---
 src/sbbs3/js_internal.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/sbbs3/js_internal.c b/src/sbbs3/js_internal.c
index 2c0b4cbaac..4887df5231 100644
--- a/src/sbbs3/js_internal.c
+++ b/src/sbbs3/js_internal.c
@@ -242,6 +242,14 @@ js_CommonBranchCallback(JSContext *cx, js_branch_t* branch)
     return(JS_TRUE);
 }
 
+static JSClass eval_class = {
+    "Global",  /* name */
+    JSCLASS_GLOBAL_FLAGS,  /* flags */
+    JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub,
+    JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
+    JSCLASS_NO_OPTIONAL_MEMBERS
+};
+
 /* Execute a string in its own context (away from Synchronet objects) */
 static JSBool
 js_eval(JSContext *parent_cx, uintN argc, jsval *arglist)
@@ -291,7 +299,7 @@ js_eval(JSContext *parent_cx, uintN argc, jsval *arglist)
 #endif
 #endif
 
-	if((obj=JS_NewObject(cx, NULL, NULL, NULL))==NULL
+	if((obj=JS_NewCompartmentAndGlobalObject(cx, &eval_class, NULL))==NULL
 		|| !JS_InitStandardClasses(cx,obj)) {
 		JS_DestroyContext(cx);
 		return(JS_FALSE);
-- 
GitLab