Skip to content

Commit

Permalink
Fix UB from out-of-range <stretch>
Browse files Browse the repository at this point in the history
If there was a scaling mode value (serialized in the XML as <stretch>
for legacy reasons) that was not 0 or 1 or 2, then the rectangle with
the stretch information would not be initialized by get_stretch_info,
which would lead to a crash, either from dividing by zero (most likely)
or from reading an uninitialized value.

To fix this, when reading <stretch>, normalize it to a sane default if
the value is otherwise bogus. And for good measure, an assertion is
added in get_stretch_info() if the value is still somehow bogus.

Fixes #1155.
  • Loading branch information
InfoTeddy committed Mar 30, 2024
1 parent 8640ead commit 217996b
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 1 deletion.
8 changes: 7 additions & 1 deletion desktop_version/src/Game.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4728,7 +4728,13 @@ void Game::deserializesettings(tinyxml2::XMLElement* dataNode, struct ScreenSett

if (SDL_strcmp(pKey, "stretch") == 0)
{
screen_settings->scalingMode = help.Int(pText);
int mode = help.Int(pText);
if (mode < 0 || mode >= NUM_SCALING_MODES)
{
/* Pick a sane default. */
mode = SCALING_INTEGER;
}
screen_settings->scalingMode = mode;
}

if (SDL_strcmp(pKey, "useLinearFilter") == 0)
Expand Down
7 changes: 7 additions & 0 deletions desktop_version/src/Graphics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3517,6 +3517,13 @@ void Graphics::get_stretch_info(SDL_Rect* rect)
rect->w = width;
rect->h = height;
break;
default:
SDL_assert(0 && "Invalid scaling mode!");
/* Width and height should be nonzero to avoid division by zero. */
rect->x = 0;
rect->y = 0;
rect->w = width;
rect->h = height;
}
}

Expand Down

0 comments on commit 217996b

Please sign in to comment.