[Scummvm-tracker] [ScummVM] #9598: SDL: write access violation with OSD when updating screen
Thierry Crozat
trac at scummvm.org
Mon Oct 3 01:27:57 CEST 2016
#9598: SDL: write access violation with OSD when updating screen
--------------------+-----------------------
Reporter: criezy | Owner:
Type: defect | Status: new
Priority: blocker | Component: --Other--
Keywords: | Game:
--------------------+-----------------------
The issue was introduced with the recent changes related to OSD in
SurfaceSdlGraphicsManager. Now when displaying OSD messages or icons dirty
rects with coordinates in destination screen are created, but the issue is
that dirty rects are assumed to be in source screen coordinates. So when
using a 2X or 3X scaler we can get dirty rects that are outside of the
screen. There is a sanity check on Y, but not on X, so in some cases we
end up trying to write beyond the destination screen when applying the
scaler.
Adding a sanity check on X would fix the crash, but this is not a proper
fix and updates would be missing.
Here is the relevant part for the call stack of the crash:
{{{
0 Normal2x(unsigned char const*, unsigned int, unsigned char*, unsigned
int, int, int) + 216 (scaler.cpp:218)
1 SurfaceSdlGraphicsManager::internUpdateScreen() + 1463 (surfacesdl-
graphics.cpp:1130)
2 SurfaceSdlGraphicsManager::updateScreen() + 145 (surfacesdl-
graphics.cpp:1006)
3 ModularBackend::updateScreen() + 50 (modular-backend.cpp:152)
}}}
I consider this a blocker because it for example causes a random crash
when using a 2X or 3X scaler and switching between windowed and full
screen mode as we get a OSD message and it triggers the bug.
With a 2X scaler when playing a 320x200 game, the OSD message when leaving
full screen generates a dirty rect starting at 274x185 en ending at
366x214. The 214 gets clips to 200 because of the sanity check, but it
still writes beyond the end of the screen surface because of the x=366 for
the right border. The dirty rect should in this case have been
137x92->183x107.
--
Ticket URL: <https://bugs.scummvm.org/ticket/9598>
ScummVM <https://bugs.scummvm.org>
ScummVM
More information about the Scummvm-tracker
mailing list