From 57cd96ef6e013073e4abfc8dbbceb46f3e0d3970 Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Thu, 14 Apr 2005 07:58:27 +0000 Subject: [PATCH] Added -S option to set thread stack size limit (using newish JS_SetThreadStackLimit API function), default is 32K bytes. This should keep jsexec from crashing due to the ircd recursion bug. It'll log a JS exception/error and exit (or loop) instead. Use "-S0" to set an unlimited thread stack size. --- src/sbbs3/jsexec.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/sbbs3/jsexec.c b/src/sbbs3/jsexec.c index 48f4c97b4b..800970cb30 100644 --- a/src/sbbs3/jsexec.c +++ b/src/sbbs3/jsexec.c @@ -47,6 +47,7 @@ #define DEFAULT_LOG_MASK 0xff /* Display all LOG levels */ #define DEFAULT_ERR_LOG_LVL LOG_WARNING +#define DEFAULT_STACK_LIMIT (32*1024) JSRuntime* js_runtime; JSContext* js_cx; @@ -55,6 +56,7 @@ js_branch_t branch; scfg_t scfg; ulong js_max_bytes=JAVASCRIPT_MAX_BYTES; ulong js_cx_stack=JAVASCRIPT_CONTEXT_STACK; +ulong stack_limit=DEFAULT_STACK_LIMIT; FILE* confp; FILE* errfp; FILE* nulfp; @@ -94,6 +96,7 @@ void usage(FILE* fp) #endif "\t-m<bytes> set maximum heap size (default=%u bytes)\n" "\t-s<bytes> set context stack size (default=%u bytes)\n" + "\t-S<bytes> set thread stack size limit (default=%u, 0=unlimited)\n" "\t-b<limit> set branch limit (default=%u, 0=unlimited)\n" "\t-y<interval> set yield interval (default=%u, 0=never)\n" "\t-g<interval> set garbage collection interval (default=%u, 0=never)\n" @@ -112,6 +115,7 @@ void usage(FILE* fp) "\t-! wait for keypress (pause) on error\n" ,JAVASCRIPT_MAX_BYTES ,JAVASCRIPT_CONTEXT_STACK + ,DEFAULT_STACK_LIMIT ,JAVASCRIPT_BRANCH_LIMIT ,JAVASCRIPT_YIELD_INTERVAL ,JAVASCRIPT_GC_INTERVAL @@ -585,6 +589,7 @@ static const char* js_ext(const char* fname) long js_exec(const char *fname, char** args) { + ulong stack_frame; int argc=0; uint line_no; char path[MAX_PATH+1]; @@ -622,6 +627,14 @@ long js_exec(const char *fname, char** args) } JS_ClearPendingException(js_cx); + if(stack_limit) { +#if JS_STACK_GROWTH_DIRECTION > 0 + stack_frame=((ulong)&stack_frame)+stack_limit; +#else + stack_frame=((ulong)&stack_frame)-stack_limit; +#endif + JS_SetThreadStackLimit(js_cx, stack_frame); + } argv=JS_NewArrayObject(js_cx, 0, NULL); JS_DefineProperty(js_cx, js_glob, "argv", OBJECT_TO_JSVAL(argv) @@ -790,6 +803,10 @@ int main(int argc, char **argv, char** environ) if(*p==0) p=argv[++argn]; js_cx_stack=strtoul(p,NULL,0); break; + case 'S': + if(*p==0) p=argv[++argn]; + stack_limit=strtoul(p,NULL,0); + break; case 'b': if(*p==0) p=argv[++argn]; branch.limit=strtoul(p,NULL,0); -- GitLab