diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c index 440d4cad6dd4b0e5e8a26aa53a2ab42c3d6fde44..e24febc835ef841b4d2ee510678860136c24668c 100644 --- a/src/sbbs3/ftpsrvr.c +++ b/src/sbbs3/ftpsrvr.c @@ -480,8 +480,8 @@ static JSContext* js_initcx(JSRuntime* runtime, SOCKET sock, JSObject** glob, JSObject** ftp, js_callback_t* cb) { JSContext* js_cx; - JSObject* js_glob; BOOL success=FALSE; + BOOL rooted=FALSE; lprintf(LOG_DEBUG,"%04d JavaScript: Initializing context (stack: %lu bytes)" ,sock,startup->js.cx_stack); @@ -501,35 +501,35 @@ js_initcx(JSRuntime* runtime, SOCKET sock, JSObject** glob, JSObject** ftp, js_c do { lprintf(LOG_DEBUG,"%04d JavaScript: Initializing Global object",sock); - if((js_glob=js_CreateGlobalObject(js_cx, &scfg, NULL, &startup->js))==NULL) + if(!js_CreateGlobalObject(js_cx, &scfg, NULL, &startup->js, glob)) break; + rooted=TRUE; - if(!JS_DefineFunctions(js_cx, js_glob, js_global_functions)) + if(!JS_DefineFunctions(js_cx, *glob, js_global_functions)) break; /* Internal JS Object */ - if(js_CreateInternalJsObject(js_cx, js_glob, cb, &startup->js)==NULL) + if(js_CreateInternalJsObject(js_cx, *glob, cb, &startup->js)==NULL) break; lprintf(LOG_DEBUG,"%04d JavaScript: Initializing System object",sock); - if(js_CreateSystemObject(js_cx, js_glob, &scfg, uptime, startup->host_name, SOCKLIB_DESC)==NULL) + if(js_CreateSystemObject(js_cx, *glob, &scfg, uptime, startup->host_name, SOCKLIB_DESC)==NULL) break; - if((*ftp=JS_DefineObject(js_cx, js_glob, "ftp", NULL + if((*ftp=JS_DefineObject(js_cx, *glob, "ftp", NULL ,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))==NULL) break; - if(js_CreateServerObject(js_cx,js_glob,&js_server_props)==NULL) + if(js_CreateServerObject(js_cx,*glob,&js_server_props)==NULL) break; - if(glob!=NULL) - *glob=js_glob; - success=TRUE; } while(0); if(!success) { + if(rooted) + JS_RemoveObjectRoot(js_cx, glob); JS_ENDREQUEST(js_cx); JS_DestroyContext(js_cx); return(NULL); @@ -4575,6 +4575,9 @@ static void ctrl_thread(void* arg) #ifdef JAVASCRIPT if(js_cx!=NULL) { lprintf(LOG_DEBUG,"%04d JavaScript: Destroying context",sock); + JS_BEGINREQUEST(js_cx); + JS_RemoveObjectRoot(js_cx, &js_glob); + JS_ENDREQUEST(js_cx); JS_DestroyContext(js_cx); /* Free Context */ } diff --git a/src/sbbs3/js_global.c b/src/sbbs3/js_global.c index 774f4902d08a7fd75bc221497379730f52b4028e..50765d75cc5ea4f3d8dffafc5590de6182a7a66d 100644 --- a/src/sbbs3/js_global.c +++ b/src/sbbs3/js_global.c @@ -128,6 +128,7 @@ static void background_thread(void* arg) result=exit_code; js_EvalOnExit(bg->cx, bg->obj, &bg->cb); js_enqueue_value(bg->cx, bg->msg_queue, result, NULL); + JS_RemoveObjectRoot(bg->cx, &bg->obj); JS_ENDREQUEST(bg->cx); JS_DestroyContext(bg->cx); jsrt_Release(bg->runtime); @@ -252,14 +253,19 @@ js_load(JSContext *cx, uintN argc, jsval *arglist) bg->cb.counter=0; bg->cb.gc_attempts=0; - if((bg->runtime = jsrt_GetNew(JAVASCRIPT_MAX_BYTES, 1000, __FILE__, __LINE__))==NULL) + if((bg->runtime = jsrt_GetNew(JAVASCRIPT_MAX_BYTES, 1000, __FILE__, __LINE__))==NULL) { + free(bg); return(JS_FALSE); + } - if((bg->cx = JS_NewContext(bg->runtime, JAVASCRIPT_CONTEXT_STACK))==NULL) + if((bg->cx = JS_NewContext(bg->runtime, JAVASCRIPT_CONTEXT_STACK))==NULL) { + jsrt_Release(bg->runtime); + free(bg); return(JS_FALSE); + } JS_BEGINREQUEST(bg->cx); - if((bg->obj=js_CreateCommonObjects(bg->cx + if(!js_CreateCommonObjects(bg->cx ,p->cfg /* common config */ ,NULL /* node-specific config */ ,NULL /* additional global methods */ @@ -271,8 +277,14 @@ js_load(JSContext *cx, uintN argc, jsval *arglist) ,NULL /* client */ ,INVALID_SOCKET /* client_socket */ ,NULL /* server props */ - ))==NULL) + ,&bg->obj + )) { + JS_ENDREQUEST(bg->cx); + JS_DestroyContext(bg->cx); + jsrt_Release(bg->runtime); + free(bg); return(JS_FALSE); + } bg->msg_queue = msgQueueInit(NULL,MSG_QUEUE_BIDIR); @@ -309,16 +321,39 @@ js_load(JSContext *cx, uintN argc, jsval *arglist) if(argn==argc) { JS_ReportError(cx,"no filename specified"); + if(background) { + JS_RemoveObjectRoot(bg->cx, &bg->obj); + JS_ENDREQUEST(bg->cx); + JS_DestroyContext(bg->cx); + jsrt_Release(bg->runtime); + free(bg); + } return(JS_FALSE); } JSVALUE_TO_STRING(cx, argv[argn++], filename, NULL); - if(filename==NULL) + if(filename==NULL) { + if(background) { + JS_RemoveObjectRoot(bg->cx, &bg->obj); + JS_ENDREQUEST(bg->cx); + JS_DestroyContext(bg->cx); + jsrt_Release(bg->runtime); + free(bg); + } return(JS_FALSE); + } if(argc>argn || background) { - if((js_argv=JS_NewArrayObject(exec_cx, 0, NULL)) == NULL) + if((js_argv=JS_NewArrayObject(exec_cx, 0, NULL)) == NULL) { + if(background) { + JS_RemoveObjectRoot(bg->cx, &bg->obj); + JS_ENDREQUEST(bg->cx); + JS_DestroyContext(bg->cx); + jsrt_Release(bg->runtime); + free(bg); + } return(JS_FALSE); + } JS_DefineProperty(exec_cx, exec_obj, "argv", OBJECT_TO_JSVAL(js_argv) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY); @@ -427,8 +462,15 @@ js_load(JSContext *cx, uintN argc, jsval *arglist) JS_ClearPendingException(exec_cx); - if((script=JS_CompileFile(exec_cx, exec_obj, path))==NULL) + if((script=JS_CompileFile(exec_cx, exec_obj, path))==NULL) { + if(background) { + JS_RemoveObjectRoot(bg->cx, &bg->obj); + JS_DestroyContext(bg->cx); + jsrt_Release(bg->runtime); + free(bg); + } return(JS_FALSE); + } if(background) { @@ -3801,36 +3843,41 @@ static JSClass js_global_class = { ,js_global_finalize /* finalize */ }; -JSObject* DLLCALL js_CreateGlobalObject(JSContext* cx, scfg_t* cfg, jsSyncMethodSpec* methods, js_startup_t* startup) +BOOL DLLCALL js_CreateGlobalObject(JSContext* cx, scfg_t* cfg, jsSyncMethodSpec* methods, js_startup_t* startup, JSObject**glob) { - JSObject* glob; private_t* p; if((p = (private_t*)malloc(sizeof(private_t)))==NULL) - return(NULL); + return(FALSE); p->cfg = cfg; p->methods = methods; p->startup = startup; - if((glob = JS_NewCompartmentAndGlobalObject(cx, &js_global_class, NULL)) ==NULL) - return(NULL); + if((*glob = JS_NewCompartmentAndGlobalObject(cx, &js_global_class, NULL)) ==NULL) + return(FALSE); + if(!JS_AddObjectRoot(cx, glob)) + return(FALSE); - if(!JS_SetPrivate(cx, glob, p)) /* Store a pointer to scfg_t and the new methods */ - return(NULL); + if(!JS_SetPrivate(cx, *glob, p)) { /* Store a pointer to scfg_t and the new methods */ + JS_RemoveObjectRoot(cx, glob); + return(FALSE); + } - if (!JS_InitStandardClasses(cx, glob)) - return(NULL); + if (!JS_InitStandardClasses(cx, *glob)) { + JS_RemoveObjectRoot(cx, glob); + return(FALSE); + } #ifdef BUILD_JSDOCS - js_DescribeSyncObject(cx,glob + js_DescribeSyncObject(cx,*glob ,"Top-level functions and properties (common to all servers and services)",310); #endif - return(glob); + return(TRUE); } -JSObject* DLLCALL js_CreateCommonObjects(JSContext* js_cx +BOOL DLLCALL js_CreateCommonObjects(JSContext* js_cx ,scfg_t* cfg /* common */ ,scfg_t* node_cfg /* node-specific */ ,jsSyncMethodSpec* methods /* global */ @@ -3842,64 +3889,72 @@ JSObject* DLLCALL js_CreateCommonObjects(JSContext* js_cx ,client_t* client /* client */ ,SOCKET client_socket /* client */ ,js_server_props_t* props /* server */ + ,JSObject** glob ) { - JSObject* js_glob; + BOOL success=FALSE; if(node_cfg==NULL) node_cfg=cfg; /* Global Object */ - if((js_glob=js_CreateGlobalObject(js_cx, cfg, methods, js_startup))==NULL) - return(NULL); + if(!js_CreateGlobalObject(js_cx, cfg, methods, js_startup, glob)) + return(FALSE); - /* System Object */ - if(js_CreateSystemObject(js_cx, js_glob, node_cfg, uptime, host_name, socklib_desc)==NULL) - return(NULL); + do { + /* System Object */ + if(js_CreateSystemObject(js_cx, *glob, node_cfg, uptime, host_name, socklib_desc)==NULL) + break; - /* Internal JS Object */ - if(cb!=NULL - && js_CreateInternalJsObject(js_cx, js_glob, cb, js_startup)==NULL) - return(NULL); + /* Internal JS Object */ + if(cb!=NULL + && js_CreateInternalJsObject(js_cx, *glob, cb, js_startup)==NULL) + break; + + /* Client Object */ + if(client!=NULL + && js_CreateClientObject(js_cx, *glob, "client", client, client_socket)==NULL) + break; - /* Client Object */ - if(client!=NULL - && js_CreateClientObject(js_cx, js_glob, "client", client, client_socket)==NULL) - return(NULL); + /* Server */ + if(props!=NULL + && js_CreateServerObject(js_cx, *glob, props)==NULL) + break; + + /* Socket Class */ + if(js_CreateSocketClass(js_cx, *glob)==NULL) + break; - /* Server */ - if(props!=NULL - && js_CreateServerObject(js_cx, js_glob, props)==NULL) - return(NULL); + /* Queue Class */ + if(js_CreateQueueClass(js_cx, *glob)==NULL) + break; - /* Socket Class */ - if(js_CreateSocketClass(js_cx, js_glob)==NULL) - return(NULL); + /* MsgBase Class */ + if(js_CreateMsgBaseClass(js_cx, *glob, cfg)==NULL) + break; - /* Queue Class */ - if(js_CreateQueueClass(js_cx, js_glob)==NULL) - return(NULL); + /* File Class */ + if(js_CreateFileClass(js_cx, *glob)==NULL) + break; - /* MsgBase Class */ - if(js_CreateMsgBaseClass(js_cx, js_glob, cfg)==NULL) - return(NULL); + /* User class */ + if(js_CreateUserClass(js_cx, *glob, cfg)==NULL) + break; - /* File Class */ - if(js_CreateFileClass(js_cx, js_glob)==NULL) - return(NULL); + /* COM Class */ + if(js_CreateCOMClass(js_cx, *glob)==NULL) + break; - /* User class */ - if(js_CreateUserClass(js_cx, js_glob, cfg)==NULL) - return(NULL); + /* Area Objects */ + if(!js_CreateUserObjects(js_cx, *glob, cfg, /* user: */NULL, client, /* html_index_fname: */NULL, /* subscan: */NULL)) + break; - /* COM Class */ - if(js_CreateCOMClass(js_cx, js_glob)==NULL) - return(NULL); + success=TRUE; + } while(0); - /* Area Objects */ - if(!js_CreateUserObjects(js_cx, js_glob, cfg, /* user: */NULL, client, /* html_index_fname: */NULL, /* subscan: */NULL)) - return(NULL); + if(!success) + JS_RemoveObjectRoot(js_cx, glob); - return(js_glob); + return(success); } #endif /* JAVSCRIPT */ diff --git a/src/sbbs3/jsexec.c b/src/sbbs3/jsexec.c index 4f03921dc96da55aecc6c36cfb457135fb46827c..acfa7b1593405e3d4d3e3fc81b50570dfd7256cc 100644 --- a/src/sbbs3/jsexec.c +++ b/src/sbbs3/jsexec.c @@ -667,7 +667,7 @@ js_OperationCallback(JSContext *cx) JS_SetOperationCallback(cx, js_OperationCallback); return ret; } -#endif + static BOOL js_CreateEnvObject(JSContext* cx, JSObject* glob, char** env) { char name[256]; @@ -723,12 +723,13 @@ static BOOL js_init(char** environ) JS_SetErrorReporter(js_cx, js_ErrorReporter); /* Global Object */ - if((js_glob=js_CreateCommonObjects(js_cx, &scfg, NULL, js_global_functions + if(!js_CreateCommonObjects(js_cx, &scfg, NULL, js_global_functions ,time(NULL), host_name, SOCKLIB_DESC /* system */ ,&cb,&startup /* js */ ,NULL,INVALID_SOCKET /* client */ ,NULL /* server */ - ))==NULL) { + ,&js_glob + )) { JS_ENDREQUEST(js_cx); return(FALSE); } @@ -1182,6 +1183,7 @@ int main(int argc, char **argv, char** environ) fprintf(statfp,"\n"); result=js_exec(module,&argv[argn]); + JS_RemoveObjectRoot(js_cx, &js_glob); JS_ENDREQUEST(js_cx); YIELD(); diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c index 7fd591df5f969b5f2d387d8495eb927b3ae94722..5cc7c7de1543a28723b92e7a49f08a246bfd67a2 100644 --- a/src/sbbs3/mailsrvr.c +++ b/src/sbbs3/mailsrvr.c @@ -1800,13 +1800,14 @@ js_mailproc(SOCKET sock, client_t* client, user_t* user, struct mailproc* mailpr if(*js_glob==NULL) { /* Global Objects (including system, js, client, Socket, MsgBase, File, User, etc. */ - if((*js_glob=js_CreateCommonObjects(*js_cx, &scfg, &scfg, NULL + if(!js_CreateCommonObjects(*js_cx, &scfg, &scfg, NULL ,uptime, startup->host_name, SOCKLIB_DESC /* system */ ,&js_callback /* js */ ,&startup->js ,client, sock /* client */ ,&js_server_props /* server */ - ))==NULL) + ,js_glob + )) break; if(!JS_DefineFunctions(*js_cx, *js_glob, js_global_functions)) @@ -1918,10 +1919,14 @@ js_mailproc(SOCKET sock, client_t* client, user_t* user, struct mailproc* mailpr return(success); } -void js_cleanup(JSRuntime* js_runtime, JSContext* js_cx) +void js_cleanup(JSRuntime* js_runtime, JSContext* js_cx, JSObject** js_glob) { - if(js_cx!=NULL) + if(js_cx!=NULL) { + JS_BEGINREQUEST(js_cx); + JS_RemoveObjectRoot(js_cx, js_glob); + JS_ENDREQUEST(js_cx); JS_DestroyContext(js_cx); + } if(js_runtime!=NULL) jsrt_Release(js_runtime); } @@ -4052,7 +4057,7 @@ static void smtp_thread(void* arg) remove(rcptlst_fname); if(spy!=NULL) fclose(spy); - js_cleanup(js_runtime, js_cx); + js_cleanup(js_runtime, js_cx, &js_glob); status(STATUS_WFC); diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp index 87578ee2ce9c423de223099004d43dd391fd63f2..bd20a7f40f9df07f39b0ba54ea26dc4ec71b8187 100644 --- a/src/sbbs3/main.cpp +++ b/src/sbbs3/main.cpp @@ -1119,14 +1119,8 @@ bool sbbs_t::js_init(ulong* stack_frame) return(false); JS_BEGINREQUEST(js_cx); - memset(&js_branch,0,sizeof(js_branch)); - js_branch.limit = startup->js.branch_limit; - js_branch.gc_interval = startup->js.gc_interval; - js_branch.yield_interval = startup->js.yield_interval; - js_branch.terminated = &terminated; - js_branch.auto_terminate = TRUE; - bool success=false; + bool rooted=false; do { @@ -1135,14 +1129,16 @@ bool sbbs_t::js_init(ulong* stack_frame) JS_SetContextPrivate(js_cx, this); /* Store a pointer to sbbs_t instance */ /* Global Objects (including system, js, client, Socket, MsgBase, File, User, etc. */ - if((js_glob=js_CreateCommonObjects(js_cx, &scfg, &cfg, js_global_functions + if(!js_CreateCommonObjects(js_cx, &scfg, &cfg, js_global_functions ,uptime, startup->host_name, SOCKLIB_DESC /* system */ - ,&js_branch /* js */ + ,&js_callback /* js */ ,&startup->js ,&client, client_socket /* client */ ,&js_server_props /* server */ - ))==NULL) + ,&js_glob + )) break; + rooted=true; /* BBS Object */ if(js_CreateBbsObject(js_cx, js_glob)==NULL) @@ -1156,12 +1152,16 @@ bool sbbs_t::js_init(ulong* stack_frame) } while(0); - JS_ENDREQUEST(js_cx); if(!success) { + if(rooted) + JS_RemoveObjectRoot(js_cx, &js_glob); + JS_ENDREQUEST(js_cx); JS_DestroyContext(js_cx); js_cx=NULL; return(false); } + else + JS_ENDREQUEST(js_cx); return(true); } @@ -1171,6 +1171,9 @@ void sbbs_t::js_cleanup(const char* node) /* Free Context */ if(js_cx!=NULL) { lprintf(LOG_DEBUG,"%s JavaScript: Destroying context",node); + JS_BEGINREQUEST(js_cx); + JS_RemoveObjectRoot(js_cx, &js_glob); + JS_ENDREQUEST(js_cx); JS_DestroyContext(js_cx); js_cx=NULL; } diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h index 05092972b2561dd8b5c57c72081962d5ac912bb1..f72395b357dd5fa487b068680fbe73694c337d13 100644 --- a/src/sbbs3/sbbs.h +++ b/src/sbbs3/sbbs.h @@ -1045,8 +1045,8 @@ extern "C" { ,js_server_props_t* props); /* js_global.c */ - DLLEXPORT JSObject* DLLCALL js_CreateGlobalObject(JSContext* cx, scfg_t* cfg, jsSyncMethodSpec* methods, js_startup_t*); - DLLEXPORT JSObject* DLLCALL js_CreateCommonObjects(JSContext* cx + DLLEXPORT BOOL DLLCALL js_CreateGlobalObject(JSContext* cx, scfg_t* cfg, jsSyncMethodSpec* methods, js_startup_t*, JSObject**); + DLLEXPORT BOOL DLLCALL js_CreateCommonObjects(JSContext* cx ,scfg_t* cfg /* common */ ,scfg_t* node_cfg /* node-specific */ ,jsSyncMethodSpec* methods /* global */ @@ -1058,6 +1058,7 @@ extern "C" { ,client_t* client /* client */ ,SOCKET client_socket /* client */ ,js_server_props_t* props /* server */ + ,JSObject** glob ); /* js_internal.c */ diff --git a/src/sbbs3/services.c b/src/sbbs3/services.c index 7773867e0691f6fb1408f50ee18eefb4ab86a020..a8c0c2642dbe2e87b888810908302189bfe91bd4 100644 --- a/src/sbbs3/services.c +++ b/src/sbbs3/services.c @@ -833,9 +833,9 @@ static JSContext* js_initcx(JSRuntime* js_runtime, SOCKET sock, service_client_t* service_client, JSObject** glob) { JSContext* js_cx; - JSObject* js_glob; JSObject* server; BOOL success=FALSE; + BOOL rooted=FALSE; if((js_cx = JS_NewContext(js_runtime, service_client->service->js.cx_stack))==NULL) return(NULL); @@ -849,50 +849,51 @@ js_initcx(JSRuntime* js_runtime, SOCKET sock, service_client_t* service_client, JS_SetContextPrivate(js_cx, service_client); - if((js_glob=js_CreateGlobalObject(js_cx, &scfg, NULL, &service_client->service->js))==NULL) + if(!js_CreateGlobalObject(js_cx, &scfg, NULL, &service_client->service->js, glob)) break; + rooted=TRUE; - if (!JS_DefineFunctions(js_cx, js_glob, js_global_functions)) + if (!JS_DefineFunctions(js_cx, *glob, js_global_functions)) break; /* Internal JS Object */ - if(js_CreateInternalJsObject(js_cx, js_glob, &service_client->callback, &service_client->service->js)==NULL) + if(js_CreateInternalJsObject(js_cx, *glob, &service_client->callback, &service_client->service->js)==NULL) break; /* Client Object */ if(service_client->client!=NULL) - if(js_CreateClientObject(js_cx, js_glob, "client", service_client->client, sock)==NULL) + if(js_CreateClientObject(js_cx, *glob, "client", service_client->client, sock)==NULL) break; /* User Class */ - if(js_CreateUserClass(js_cx, js_glob, &scfg)==NULL) + if(js_CreateUserClass(js_cx, *glob, &scfg)==NULL) break; /* Socket Class */ - if(js_CreateSocketClass(js_cx, js_glob)==NULL) + if(js_CreateSocketClass(js_cx, *glob)==NULL) break; /* MsgBase Class */ - if(js_CreateMsgBaseClass(js_cx, js_glob, &scfg)==NULL) + if(js_CreateMsgBaseClass(js_cx, *glob, &scfg)==NULL) break; /* File Class */ - if(js_CreateFileClass(js_cx, js_glob)==NULL) + if(js_CreateFileClass(js_cx, *glob)==NULL) break; /* Queue Class */ - if(js_CreateQueueClass(js_cx, js_glob)==NULL) + if(js_CreateQueueClass(js_cx, *glob)==NULL) break; /* COM Class */ - if(js_CreateCOMClass(js_cx, js_glob)==NULL) + if(js_CreateCOMClass(js_cx, *glob)==NULL) break; /* user-specific objects */ - if(!js_CreateUserObjects(js_cx, js_glob, &scfg, /*user: */NULL, service_client->client, NULL, service_client->subscan)) + if(!js_CreateUserObjects(js_cx, *glob, &scfg, /*user: */NULL, service_client->client, NULL, service_client->subscan)) break; - if(js_CreateSystemObject(js_cx, js_glob, &scfg, uptime, startup->host_name, SOCKLIB_DESC)==NULL) + if(js_CreateSystemObject(js_cx, *glob, &scfg, uptime, startup->host_name, SOCKLIB_DESC)==NULL) break; #if 0 char ver[256]; @@ -900,7 +901,7 @@ js_initcx(JSRuntime* js_runtime, SOCKET sock, service_client_t* service_client, jsval val; /* server object */ - if((server=JS_DefineObject(js_cx, js_glob, "server", &js_server_class + if((server=JS_DefineObject(js_cx, *glob, "server", &js_server_class ,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))==NULL) break; @@ -935,7 +936,7 @@ js_initcx(JSRuntime* js_runtime, SOCKET sock, service_client_t* service_client, &service_client->service->options; } - if((server=js_CreateServerObject(js_cx,js_glob + if((server=js_CreateServerObject(js_cx,*glob ,&service_client->service->js_server_props))==NULL) break; #endif @@ -948,16 +949,14 @@ js_initcx(JSRuntime* js_runtime, SOCKET sock, service_client_t* service_client, JS_DefineFunction(js_cx, server, "client_update", js_client_update, 1, 0); JS_DefineFunction(js_cx, server, "client_remove", js_client_remove, 1, 0); - - if(glob!=NULL) - *glob=js_glob; - success=TRUE; } while(0); if(!success) { + if(rooted) + JS_RemoveObjectRoot(js_cx, glob); JS_ENDREQUEST(js_cx); JS_DestroyContext(js_cx); return(NULL); @@ -1184,6 +1183,7 @@ static void js_service_thread(void* arg) JS_ExecuteScript(js_cx, js_glob, js_script, &rval); js_EvalOnExit(js_cx, js_glob, &service_client.callback); } + JS_RemoveObjectRoot(js_cx, &js_glob); JS_ENDREQUEST(js_cx); JS_DestroyContext(js_cx); /* Free Context */ @@ -1288,13 +1288,14 @@ static void js_static_service_thread(void* arg) js_PrepareToExecute(js_cx, js_glob, spath, /* startup_dir */NULL); JS_ExecuteScript(js_cx, js_glob, js_script, &rval); js_EvalOnExit(js_cx, js_glob, &service_client.callback); - + JS_RemoveObjectRoot(js_cx, &js_glob); JS_ENDREQUEST(js_cx); JS_DestroyContext(js_cx); /* Free Context */ js_cx=NULL; } while(!service->terminated && service->options&SERVICE_OPT_STATIC_LOOP); if(js_cx!=NULL) { + JS_RemoveObjectRoot(js_cx, &js_glob); JS_ENDREQUEST(js_cx); JS_DestroyContext(js_cx); /* Free Context */ } diff --git a/src/sbbs3/websrvr.c b/src/sbbs3/websrvr.c index a47c1981d9ea12d01273a32369ea799dee367c39..02e86a507c0e26ee041cd0edf2d6f22fa17d625b 100644 --- a/src/sbbs3/websrvr.c +++ b/src/sbbs3/websrvr.c @@ -4458,7 +4458,7 @@ js_initcx(http_session_t *session) JS_SetOperationCallback(js_cx, js_OperationCallback); lprintf(LOG_DEBUG,"%04d JavaScript: Creating Global Objects and Classes",session->socket); - if((session->js_glob=js_CreateCommonObjects(js_cx, &scfg, NULL + if(!js_CreateCommonObjects(js_cx, &scfg, NULL ,NULL /* global */ ,uptime /* system */ ,startup->host_name /* system */ @@ -4468,8 +4468,10 @@ js_initcx(http_session_t *session) ,&session->client /* client */ ,session->socket /* client */ ,&js_server_props /* server */ - ))==NULL + ,&session->js_glob + ) || !JS_DefineFunctions(js_cx, session->js_glob, js_global_functions)) { + JS_RemoveObjectRoot(js_cx, &session->js_glob); JS_ENDREQUEST(js_cx); JS_DestroyContext(js_cx); return(NULL); @@ -4627,6 +4629,7 @@ static BOOL exec_ssjs(http_session_t* session, char* script) { ,script))==NULL) { lprintf(LOG_ERR,"%04d !JavaScript FAILED to compile script (%s)" ,session->socket,script); + JS_RemoveObjectRoot(session->js_cx, &session->js_glob); JS_ENDREQUEST(session->js_cx); return(FALSE); } @@ -4636,6 +4639,7 @@ static BOOL exec_ssjs(http_session_t* session, char* script) { js_PrepareToExecute(session->js_cx, session->js_glob, script, /* startup_dir */NULL); JS_ExecuteScript(session->js_cx, session->js_glob, js_script, &rval); js_EvalOnExit(session->js_cx, session->js_glob, &session->js_callback); + JS_RemoveObjectRoot(session->js_cx, &session->js_glob); lprintf(LOG_DEBUG,"%04d JavaScript: Done executing script: %s (%.2Lf seconds)" ,session->socket,script,xp_timer()-start); } while(0); @@ -5109,6 +5113,9 @@ void http_session_thread(void* arg) if(session.js_cx!=NULL) { lprintf(LOG_DEBUG,"%04d JavaScript: Destroying context",socket); + JS_BEGINREQUEST(session.js_cx); + JS_RemoveObjectRoot(session.js_cx, &session.js_glob); + JS_ENDREQUEST(session.js_cx); JS_DestroyContext(session.js_cx); /* Free Context */ session.js_cx=NULL; }