* Fixes the NTSL crashing the server by setting the max recursion limit to 15. The problem was that the BYOND recursion limit was being met before the NTSL recursion limit.

* Added admin warning messages for the recursion limit.
 * Made the admin warnings only appear for every new program that is loaded, and not for everytime the script runs.
 * Made the preset servers set their names to their ID.
This commit is contained in:
Giacomand
2013-08-06 01:49:00 +01:00
parent 6f4e534ca3
commit 53244202be
3 changed files with 23 additions and 12 deletions
@@ -21,6 +21,7 @@
ASSERT(program)
src.program = program
CreateGlobalScope()
alertadmins = 0 // reset admin alerts
/*
Proc: Run
@@ -29,7 +30,6 @@
Run()
cur_recursion = 0 // reset recursion
cur_statements = 0 // reset CPU tracking
alertadmins = 0
ASSERT(src.program)
RunBlock(src.program)
@@ -37,7 +37,7 @@
cur_statements=0 // current amount of statements called
alertadmins=0 // set to 1 if the admins shouldn't be notified of anymore issues
max_iterations=100 // max number of uninterrupted loops possible
max_recursion=50 // max recursions without returning anything (or completing the code block)
max_recursion=10 // max recursions without returning anything (or completing the code block)
cur_recursion=0 // current amount of recursion
/*
Var: persist
@@ -84,6 +84,19 @@
globalScope = S
return S
/*
Proc: AlertAdmins
Alerts the admins of a script that is bad.
*/
AlertAdmins()
if(container && !alertadmins)
if(istype(container, /datum/TCS_Compiler))
var/datum/TCS_Compiler/Compiler = container
var/obj/machinery/telecomms/server/Holder = Compiler.Holder
var/message = "Potential crash-inducing NTSL script detected at telecommunications server [Compiler.Holder] ([Holder.x], [Holder.y], [Holder.z])."
alertadmins = 1
message_admins(message, 1)
/*
Proc: RunBlock
Runs each statement in a block of code.
@@ -108,15 +121,7 @@
cur_statements++
if(cur_statements >= max_statements)
RaiseError(new/runtimeError/MaxCPU())
if(container && !alertadmins)
if(istype(container, /datum/TCS_Compiler))
var/datum/TCS_Compiler/Compiler = container
var/obj/machinery/telecomms/server/Holder = Compiler.Holder
var/message = "Potential crash-inducing NTSL script detected at telecommunications server [Compiler.Holder] ([Holder.x], [Holder.y], [Holder.z])."
alertadmins = 1
message_admins(message, 1)
AlertAdmins()
break
if(istype(S, /node/statement/VariableAssignment))
@@ -179,6 +184,7 @@
// If recursion gets too high (max 50 nested functions) throw an error
if(cur_recursion >= max_recursion)
AlertAdmins()
RaiseError(new/runtimeError/RecursionLimitReached())
return 0
@@ -331,3 +337,4 @@
//TODO: check for invalid name
S.variables["[name]"] = value