diff --git a/README.md b/README.md index af63f7945..ed50c5672 100644 --- a/README.md +++ b/README.md @@ -147,14 +147,17 @@ information on what to include when reporting a bug. a modal to a fallback decoration - [Wayland] Bugfix: The cursor position was not updated when clicking through from a modal to the content area + - [Wayland] Bugfix: free modules at end of terminate function to resolve + potential segmentation fault (#2744) - [X11] Bugfix: Running without a WM could trigger an assert (#2593,#2601,#2631) - [X11] Bugfix: Occasional crash when an idle display awakes (#2766) + - [X11] Bugfix: Prevent BadWindow when creating small windows with a content scale + less than 1 (#2754) + - [X11] Bugfix: Clamp width and height to >= 1 to prevent BadValue error and app exit - [Null] Added Vulkan 'window' surface creation via `VK_EXT_headless_surface` - [Null] Added EGL context creation on Mesa via `EGL_MESA_platform_surfaceless` - [EGL] Allowed native access on Wayland with `GLFW_CONTEXT_CREATION_API` set to `GLFW_NATIVE_CONTEXT_API` (#2518) - - [X11] Bugfix: Prevent BadWindow when creating small windows with a content scale - less than 1 (#2754) ## Contact diff --git a/src/egl_context.c b/src/egl_context.c index 579128817..5cec46038 100644 --- a/src/egl_context.c +++ b/src/egl_context.c @@ -561,7 +561,8 @@ void _glfwTerminateEGL(void) _glfw.egl.display = EGL_NO_DISPLAY; } - if (_glfw.egl.handle) + // Free modules only after all wayland termination functions are called + if (_glfw.egl.handle && _glfw.platform.platformID != GLFW_PLATFORM_WAYLAND) { _glfwPlatformFreeModule(_glfw.egl.handle); _glfw.egl.handle = NULL; diff --git a/src/wl_init.c b/src/wl_init.c index bdc2e29a1..158fd5f3c 100644 --- a/src/wl_init.c +++ b/src/wl_init.c @@ -908,18 +908,6 @@ void _glfwTerminateWayland(void) libdecor_unref(_glfw.wl.libdecor.context); } - if (_glfw.wl.libdecor.handle) - { - _glfwPlatformFreeModule(_glfw.wl.libdecor.handle); - _glfw.wl.libdecor.handle = NULL; - } - - if (_glfw.wl.egl.handle) - { - _glfwPlatformFreeModule(_glfw.wl.egl.handle); - _glfw.wl.egl.handle = NULL; - } - if (_glfw.wl.xkb.composeState) xkb_compose_state_unref(_glfw.wl.xkb.composeState); if (_glfw.wl.xkb.keymap) @@ -928,21 +916,11 @@ void _glfwTerminateWayland(void) xkb_state_unref(_glfw.wl.xkb.state); if (_glfw.wl.xkb.context) xkb_context_unref(_glfw.wl.xkb.context); - if (_glfw.wl.xkb.handle) - { - _glfwPlatformFreeModule(_glfw.wl.xkb.handle); - _glfw.wl.xkb.handle = NULL; - } if (_glfw.wl.cursorTheme) wl_cursor_theme_destroy(_glfw.wl.cursorTheme); if (_glfw.wl.cursorThemeHiDPI) wl_cursor_theme_destroy(_glfw.wl.cursorThemeHiDPI); - if (_glfw.wl.cursor.handle) - { - _glfwPlatformFreeModule(_glfw.wl.cursor.handle); - _glfw.wl.cursor.handle = NULL; - } for (unsigned int i = 0; i < _glfw.wl.offerCount; i++) wl_data_offer_destroy(_glfw.wl.offers[i].offer); @@ -1002,6 +980,36 @@ void _glfwTerminateWayland(void) if (_glfw.wl.cursorTimerfd >= 0) close(_glfw.wl.cursorTimerfd); + // Free modules only after all wayland termination functions are called + if (_glfw.egl.handle) + { + _glfwPlatformFreeModule(_glfw.egl.handle); + _glfw.egl.handle = NULL; + } + + if (_glfw.wl.libdecor.handle) + { + _glfwPlatformFreeModule(_glfw.wl.libdecor.handle); + _glfw.wl.libdecor.handle = NULL; + } + + if (_glfw.wl.egl.handle) + { + _glfwPlatformFreeModule(_glfw.wl.egl.handle); + _glfw.wl.egl.handle = NULL; + } + + if (_glfw.wl.xkb.handle) + { + _glfwPlatformFreeModule(_glfw.wl.xkb.handle); + _glfw.wl.xkb.handle = NULL; + } + if (_glfw.wl.cursor.handle) + { + _glfwPlatformFreeModule(_glfw.wl.cursor.handle); + _glfw.wl.cursor.handle = NULL; + } + _glfw_free(_glfw.wl.clipboardString); } diff --git a/src/x11_window.c b/src/x11_window.c index c96c77ff0..0cc0314b6 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -2207,6 +2207,10 @@ void _glfwGetWindowSizeX11(_GLFWwindow* window, int* width, int* height) void _glfwSetWindowSizeX11(_GLFWwindow* window, int width, int height) { + // The dimensions must be nonzero, or a BadValue error results. + width = _glfw_max(1, width); + height = _glfw_max(1, height); + if (window->monitor) { if (window->monitor->window == window)