From d91a36c66f81385425e690fe2dafcb247ff1a383 Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Fri, 4 Nov 2011 01:46:10 +0000
Subject: [PATCH] Also need to context suspend dance in the js_CopyValue()
 function

---
 src/sbbs3/js_global.c | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/src/sbbs3/js_global.c b/src/sbbs3/js_global.c
index cbf348d5bf..3367e01808 100644
--- a/src/sbbs3/js_global.c
+++ b/src/sbbs3/js_global.c
@@ -208,16 +208,23 @@ js_log(JSContext *cx, uintN argc, jsval *arglist)
 }
 
 /* Create a new value in the new context with a value from the original context */
-static jsval* js_CopyValue(JSContext* cx, jsval val, JSContext* new_cx, jsval* rval)
+/* BOTH CONTEXTX NEED TO BE SUSPENDED! */
+static jsval* js_CopyValue(JSContext* cx, jsrefcount *cx_rc, jsval val, JSContext* new_cx, jsrefcount *new_rc, jsval* rval)
 {
 	size_t	size;
 	uint64	*nval;
 
 	*rval = JSVAL_VOID;
+	JS_RESUMEREQUEST(cx, *cx_rc);
 	if(JS_WriteStructuredClone(cx, val, &nval, &size, NULL, NULL)) {
+		*cx_rc=JS_SUSPENDREQUEST(cx);
+		JS_RESUMEREQUEST(new_cx, *new_rc);
 		JS_ReadStructuredClone(new_cx, nval, size, JS_STRUCTURED_CLONE_VERSION, rval, NULL, NULL);
+		*new_rc=JS_SUSPENDREQUEST(new_cx);
+		JS_RESUMEREQUEST(cx, *cx_rc);
 		JS_free(cx, nval);
 	}
+	*cx_rc=JS_SUSPENDREQUEST(cx);
 
 	return rval;
 }
@@ -440,8 +447,13 @@ js_load(JSContext *cx, uintN argc, jsval *arglist)
 		JS_DefineProperty(exec_cx, exec_obj, "argv", OBJECT_TO_JSVAL(js_argv)
 			,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY);
 
-		for(i=argn; i<argc; i++)
-			JS_SetElement(exec_cx, js_argv, i-argn, js_CopyValue(cx,argv[i],exec_cx,&val));
+		for(i=argn; i<argc; i++) {
+			jsval *copy;
+			brc=JS_SUSPENDREQUEST(bg->cx);
+			copy=js_CopyValue(cx,&rc,argv[i],exec_cx,&brc,&val);
+			JS_RESUMEREQUEST(bg->cx, brc);
+			JS_SetElement(exec_cx, js_argv, i-argn, copy);
+		}
 
 		JS_DefineProperty(exec_cx, exec_obj, "argc", INT_TO_JSVAL(argc-argn)
 			,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY);
-- 
GitLab