diff options
author | Colin Snover | 2016-03-18 13:08:37 -0500 |
---|---|---|
committer | Colin Snover | 2016-03-18 13:08:37 -0500 |
commit | e25d928a9cb82d458c7f592ec81576f0d57d8eca (patch) | |
tree | 6fc1c40adc8bebf6174fcc49f3514d576ae0a1b6 /engines/sci/graphics/screen_item32.cpp | |
parent | 856f3ae6489b3f9aec62043c58c3961baf619f16 (diff) | |
download | scummvm-rg350-e25d928a9cb82d458c7f592ec81576f0d57d8eca.tar.gz scummvm-rg350-e25d928a9cb82d458c7f592ec81576f0d57d8eca.tar.bz2 scummvm-rg350-e25d928a9cb82d458c7f592ec81576f0d57d8eca.zip |
SCI32: Fix crashes in kIsOnMe caused by stale CelObjs
Diffstat (limited to 'engines/sci/graphics/screen_item32.cpp')
-rw-r--r-- | engines/sci/graphics/screen_item32.cpp | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/engines/sci/graphics/screen_item32.cpp b/engines/sci/graphics/screen_item32.cpp index c44d3e96f1..c3fdbb6845 100644 --- a/engines/sci/graphics/screen_item32.cpp +++ b/engines/sci/graphics/screen_item32.cpp @@ -115,7 +115,17 @@ _screenRect(other._screenRect) { } void ScreenItem::operator=(const ScreenItem &other) { - _celInfo = other._celInfo; + // NOTE: The original engine did not check for differences in `_celInfo` + // to clear `_celObj` here; instead, it unconditionally set `_celInfo`, + // didn't clear `_celObj`, and did hacky stuff in `kIsOnMe` to avoid + // testing a mismatched `_celObj`. See `GfxFrameout::kernelIsOnMe` for + // more detail. + if (_celInfo != other._celInfo) { + _celInfo = other._celInfo; + delete _celObj; + _celObj = nullptr; + } + _screenRect = other._screenRect; _mirrorX = other._mirrorX; _useInsetRect = other._useInsetRect; |