diff options
author | frosch <frosch@openttd.org> | 2016-05-30 21:03:11 +0000 |
---|---|---|
committer | frosch <frosch@openttd.org> | 2016-05-30 21:03:11 +0000 |
commit | a2edf52b418743dc82a823ef1d65870584af4d4a (patch) | |
tree | e90952d4ab12f0987fe733bc1cc0e2c408d8eb28 | |
parent | d90686f0217c2ad8dfc814694b7b9ea578dd7a49 (diff) | |
download | openttd-a2edf52b418743dc82a823ef1d65870584af4d4a.tar.xz |
(svn r27594) -Fix [FS#6473]: [Script] Kill scripts, when a non-suspendable valuator call takes way too long.
-rw-r--r-- | src/script/api/script_list.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/script/api/script_list.cpp b/src/script/api/script_list.cpp index bdbc1209b..d0c72b5bb 100644 --- a/src/script/api/script_list.cpp +++ b/src/script/api/script_list.cpp @@ -11,6 +11,7 @@ #include "../../stdafx.h" #include "script_list.hpp" +#include "script_controller.hpp" #include "../../debug.h" #include "../../script/squirrel.hpp" @@ -905,6 +906,16 @@ SQInteger ScriptList::Valuate(HSQUIRRELVM vm) } } + /* Kill the script when the valuator call takes way too long. + * Triggered by nesting valuators, which then take billions of iterations. */ + if (ScriptController::GetOpsTillSuspend() < -1000000) { + /* See below for explanation. The extra pop is the return value. */ + sq_pop(vm, nparam + 4); + + ScriptObject::SetAllowDoCommand(backup_allow); + return sq_throwerror(vm, "excessive CPU usage in valuator function"); + } + /* Was something changed? */ if (previous_modification_count != this->modifications) { /* See below for explanation. The extra pop is the return value. */ |