From a12dada82249cb713e2a9162b26ad3207127726c Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 5 Apr 2011 11:13:08 +0200 Subject: SCUMM: Fix off-by-one mistakes in out-of-bounds checks; name some constants --- engines/scumm/script.cpp | 14 +++++++------- engines/scumm/script.h | 21 +++++++++++++++++---- 2 files changed, 24 insertions(+), 11 deletions(-) (limited to 'engines/scumm') diff --git a/engines/scumm/script.cpp b/engines/scumm/script.cpp index a76461f579..c481fb8a4e 100644 --- a/engines/scumm/script.cpp +++ b/engines/scumm/script.cpp @@ -319,6 +319,9 @@ void ScummEngine::runScriptNested(int script) { updateScriptPtr(); + if (vm.numNestedScripts >= kMaxScriptNesting) + error("Too many nested scripts"); + nest = &vm.nest[vm.numNestedScripts]; if (_currentScript == 0xFF) { @@ -334,9 +337,6 @@ void ScummEngine::runScriptNested(int script) { vm.numNestedScripts++; - if (vm.numNestedScripts > ARRAYSIZE(vm.nest)) - error("Too many nested scripts"); - _currentScript = script; getScriptBaseAddress(); resetScriptPointer(); @@ -1284,7 +1284,7 @@ void ScummEngine::beginCutscene(int *args) { vm.slot[scr].cutsceneOverride++; ++vm.cutSceneStackPointer; - if (vm.cutSceneStackPointer > ARRAYSIZE(vm.cutSceneData)) + if (vm.cutSceneStackPointer >= kMaxCutsceneNum) error("Cutscene stack overflow"); vm.cutSceneData[vm.cutSceneStackPointer] = args[0]; @@ -1325,7 +1325,7 @@ void ScummEngine::endCutscene() { void ScummEngine::abortCutscene() { const int idx = vm.cutSceneStackPointer; - assert(0 <= idx && idx < 5); + assert(0 <= idx && idx < kMaxCutsceneNum); uint32 offs = vm.cutScenePtr[idx]; if (offs) { @@ -1344,7 +1344,7 @@ void ScummEngine::abortCutscene() { void ScummEngine::beginOverride() { const int idx = vm.cutSceneStackPointer; - assert(0 <= idx && idx < 5); + assert(0 <= idx && idx < kMaxCutsceneNum); vm.cutScenePtr[idx] = _scriptPointer - _scriptOrgPointer; vm.cutSceneScript[idx] = _currentScript; @@ -1361,7 +1361,7 @@ void ScummEngine::beginOverride() { void ScummEngine::endOverride() { const int idx = vm.cutSceneStackPointer; - assert(0 <= idx && idx < 5); + assert(0 <= idx && idx < kMaxCutsceneNum); vm.cutScenePtr[idx] = 0; vm.cutSceneScript[idx] = 0; diff --git a/engines/scumm/script.h b/engines/scumm/script.h index dbfa2630e5..39d5d802b4 100644 --- a/engines/scumm/script.h +++ b/engines/scumm/script.h @@ -98,16 +98,29 @@ struct NestedScript { uint8 slot; }; +enum { + /** + * The maximal number of cutscenes that can be active + * in parallel (i.e. nested). + */ + kMaxCutsceneNum = 5, + + /** + * The maximal 'nesting' level for scripts. + */ + kMaxScriptNesting = 15 +}; + struct VirtualMachineState { - uint32 cutScenePtr[5]; - byte cutSceneScript[5]; - int16 cutSceneData[5]; + uint32 cutScenePtr[kMaxCutsceneNum]; + byte cutSceneScript[kMaxCutsceneNum]; + int16 cutSceneData[kMaxCutsceneNum]; int16 cutSceneScriptIndex; byte cutSceneStackPointer; ScriptSlot slot[NUM_SCRIPT_SLOT]; int32 localvar[NUM_SCRIPT_SLOT][26]; - NestedScript nest[15]; + NestedScript nest[kMaxScriptNesting]; byte numNestedScripts; }; -- cgit v1.2.3