Commit 1803944bb2bc5665d54eb705d3213c17850d18cf

Sylvain Becker 2019-01-09T15:18:41

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() ).

diff --git a/src/video/android/SDL_androidwindow.c b/src/video/android/SDL_androidwindow.c
index e34d1ed..57731d3 100644
--- a/src/video/android/SDL_androidwindow.c
+++ b/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