From c254bfb265e3bb424560f3ff135f3d1b615375c0 Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Sat, 23 Jun 2001 00:50:59 +0000 Subject: [PATCH] scripts are now executed in their own local scope. --- src/sbbs3/exec.cpp | 66 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 59 insertions(+), 7 deletions(-) diff --git a/src/sbbs3/exec.cpp b/src/sbbs3/exec.cpp index fc6e8bc769..9e91ea6c4b 100644 --- a/src/sbbs3/exec.cpp +++ b/src/sbbs3/exec.cpp @@ -523,12 +523,34 @@ char * sbbs_t::copystrvar(csi_t *csi, char *p, char *str) } #ifdef JAVASCRIPT -long sbbs_t::js_execfile(char *fname) + +static JSClass js_scope_class ={ + "Scope", + 0, /* flags */ + JS_PropertyStub,JS_PropertyStub,JS_PropertyStub,JS_PropertyStub, + JS_EnumerateStub,JS_ResolveStub,JS_ConvertStub,JS_FinalizeStub + }; + +long sbbs_t::js_execfile(char *cmd) { + char* p; + char* args=NULL; + char* fname; + int argc=0; + char cmdline[MAX_PATH+1]; char path[MAX_PATH+1]; - JSScript* js_script; + JSObject* js_scope=NULL; + JSScript* js_script=NULL; jsval rval; + sprintf(cmdline,"%.*s",sizeof(cmdline)-1,cmd); + p=strchr(cmdline,' '); + if(p!=NULL) { + *p=0; + args=p+1; + } + fname=cmdline; + /* Add extension if not specified */ if(!strchr(fname,BACKSLASH)) sprintf(path,"%s%s",cfg.exec_dir,fname); @@ -544,21 +566,51 @@ long sbbs_t::js_execfile(char *fname) JS_BeginRequest(js_cx); /* Required for multi-thread support */ - js_script=JS_CompileFile(js_cx, js_glob, path); + js_scope=JS_NewObject(js_cx, &js_scope_class, NULL, js_glob); + + if(js_scope!=NULL) { + + JSObject* argv=JS_NewArrayObject(js_cx, 0, NULL); + + if(args!=NULL && argv!=NULL) { + while(*args) { + p=strchr(args,' '); + if(p!=NULL) + *p=0; + while(*args && *args==' ') args++; /* Skip spaces */ + JSString* arg = JS_NewStringCopyZ(js_cx, args); + if(arg==NULL) + break; + jsval val=STRING_TO_JSVAL(arg); + if(!JS_SetElement(js_cx, argv, argc, &val)) + break; + argc++; + if(p==NULL) /* last arg */ + break; + args+=(strlen(args)+1); + } + } + JS_DefineProperty(js_cx, js_scope, "argv", OBJECT_TO_JSVAL(argv) + ,NULL,NULL,JSPROP_READONLY); + JS_DefineProperty(js_cx, js_scope, "argc", INT_TO_JSVAL(argc) + ,NULL,NULL,JSPROP_READONLY); -// js_scope=JS_NewScriptObject(js_cx, js_script); + js_script=JS_CompileFile(js_cx, js_scope, path); + } JS_EndRequest(js_cx); /* Required for multi-thread support */ - if(js_script==NULL) { + if(js_scope==NULL || js_script==NULL) { errormsg(WHERE,ERR_EXEC,path,0); return(-1); } - JS_ExecuteScript(js_cx, js_glob, js_script, &rval); + JS_ExecuteScript(js_cx, js_scope, js_script, &rval); JS_DestroyScript(js_cx, js_script); + JS_ClearScope(js_cx, js_scope); + JS_GC(js_cx); return(JSVAL_TO_INT(rval)); @@ -1540,7 +1592,7 @@ int sbbs_t::exec(csi_t *csi) log(csi->str); return(0); case CS_CHKSYSPASS: - csi->logic=!chksyspass(0); + csi->logic=!chksyspass(); return(0); case CS_PUT_NODE: getnodedat(cfg.node_num,&thisnode,1); -- GitLab