Skip to content
Permalink
Browse files

Android: concurrency issue for Android_SetWindowFullscreen()

It accesses data->native_window, which can be changed by onNativeSurfacedChanged().

Currently, Android_SetWindowFullscreen() may access data->native_window after it
has been released, and before a new reference is acquired.

(can be reproduced by adding some SDL_Delay() in onNativeSurfacedChanged and
Android_SetWindowFullscreen() ).
  • Loading branch information
1bsyl committed Jan 9, 2019
1 parent 59df6d6 commit 1803944bb2bc5665d54eb705d3213c17850d18cf
Showing with 32 additions and 23 deletions.
  1. +32 −23 src/video/android/SDL_androidwindow.c
@@ -116,36 +116,45 @@ Android_SetWindowTitle(_THIS, SDL_Window *window)
void
Android_SetWindowFullscreen(_THIS, SDL_Window *window, SDL_VideoDisplay *display, SDL_bool fullscreen)
{
/* If the window is being destroyed don't change visible state */
if (!window->is_destroying) {
Android_JNI_SetWindowStyle(fullscreen);
}
SDL_LockMutex(Android_ActivityMutex);

/* Ensure our size matches reality after we've executed the window style change.
*
* It is possible that we've set width and height to the full-size display, but on
* Samsung DeX or Chromebooks or other windowed Android environemtns, our window may
* still not be the full display size.
*/
if (!SDL_IsDeXMode() && !SDL_IsChromebook()) {
return;
}
if (window == Android_Window) {

SDL_WindowData *data = (SDL_WindowData *)window->driverdata;
/* If the window is being destroyed don't change visible state */
if (!window->is_destroying) {
Android_JNI_SetWindowStyle(fullscreen);
}

if (!data || !data->native_window) {
return;
}
/* Ensure our size matches reality after we've executed the window style change.
*
* It is possible that we've set width and height to the full-size display, but on
* Samsung DeX or Chromebooks or other windowed Android environemtns, our window may
* still not be the full display size.
*/
if (!SDL_IsDeXMode() && !SDL_IsChromebook()) {
goto endfunction;
}

int old_w = window->w;
int old_h = window->h;
SDL_WindowData *data = (SDL_WindowData *)window->driverdata;

int new_w = ANativeWindow_getWidth(data->native_window);
int new_h = ANativeWindow_getHeight(data->native_window);
if (!data || !data->native_window) {
goto endfunction;
}

int old_w = window->w;
int old_h = window->h;

if (old_w != new_w || old_h != new_h) {
SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, new_w, new_h);
int new_w = ANativeWindow_getWidth(data->native_window);
int new_h = ANativeWindow_getHeight(data->native_window);

if (old_w != new_w || old_h != new_h) {
SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, new_w, new_h);
}
}

endfunction:

SDL_UnlockMutex(Android_ActivityMutex);
}

void

0 comments on commit 1803944

Please sign in to comment.