Commit: 5cbc8ce3b14558cf208f30cc01aea55e00816003 Author: Campbell Barton Date: Mon Jan 16 15:15:47 2023 +1100 Branches: master https://developer.blender.org/rB5cbc8ce3b14558cf208f30cc01aea55e00816003
Fix ASAN error when Wayland fell back to X11 An alternative fix to [0] which caused an error with ASAN (freeing an GHOST_ISystem instead of a GHOST_System). Reported by @Baardaap in chat, I'm unable to reproduce the issue. Instead of calling the destructor directly, add a private method that deletes data before raising an exception. [0]: fd36221930e35efd2c09af8fb91234a510e3b9dc =================================================================== M intern/ghost/intern/GHOST_SystemWayland.cpp M intern/ghost/intern/GHOST_SystemWayland.h =================================================================== diff --git a/intern/ghost/intern/GHOST_SystemWayland.cpp b/intern/ghost/intern/GHOST_SystemWayland.cpp index fbe5159ea78..6a163d8661e 100644 --- a/intern/ghost/intern/GHOST_SystemWayland.cpp +++ b/intern/ghost/intern/GHOST_SystemWayland.cpp @@ -5328,7 +5328,7 @@ GHOST_SystemWayland::GHOST_SystemWayland(bool background) /* Connect to the Wayland server. */ display_->wl_display = wl_display_connect(nullptr); if (!display_->wl_display) { - this->~GHOST_SystemWayland(); + display_destroy_and_free_all(); throw std::runtime_error("Wayland: unable to connect to display!"); } @@ -5372,7 +5372,7 @@ GHOST_SystemWayland::GHOST_SystemWayland(bool background) "WAYLAND found but libdecor was not, install libdecor for Wayland support, " "falling back to X11\n"); # endif - this->~GHOST_SystemWayland(); + display_destroy_and_free_all(); throw std::runtime_error("Wayland: unable to find libdecor!"); use_libdecor = true; @@ -5389,7 +5389,7 @@ GHOST_SystemWayland::GHOST_SystemWayland(bool background) GWL_LibDecor_System &decor = *display_->libdecor; decor.context = libdecor_new(display_->wl_display, &libdecor_interface); if (!decor.context) { - this->~GHOST_SystemWayland(); + display_destroy_and_free_all(); throw std::runtime_error("Wayland: unable to create window decorations!"); } } @@ -5400,7 +5400,7 @@ GHOST_SystemWayland::GHOST_SystemWayland(bool background) { GWL_XDG_Decor_System &decor = *display_->xdg_decor; if (!decor.shell) { - this->~GHOST_SystemWayland(); + display_destroy_and_free_all(); throw std::runtime_error("Wayland: unable to access xdg_shell!"); } } @@ -5410,7 +5410,7 @@ GHOST_SystemWayland::GHOST_SystemWayland(bool background) #endif } -GHOST_SystemWayland::~GHOST_SystemWayland() +void GHOST_SystemWayland::display_destroy_and_free_all() { gwl_display_destroy(display_); @@ -5420,6 +5420,11 @@ GHOST_SystemWayland::~GHOST_SystemWayland() #endif } +GHOST_SystemWayland::~GHOST_SystemWayland() +{ + display_destroy_and_free_all(); +} + GHOST_TSuccess GHOST_SystemWayland::init() { GHOST_TSuccess success = GHOST_System::init(); diff --git a/intern/ghost/intern/GHOST_SystemWayland.h b/intern/ghost/intern/GHOST_SystemWayland.h index c745d3b1d36..44026d5efad 100644 --- a/intern/ghost/intern/GHOST_SystemWayland.h +++ b/intern/ghost/intern/GHOST_SystemWayland.h @@ -242,5 +242,11 @@ class GHOST_SystemWayland : public GHOST_System { #endif private: + /** + * Support freeing the internal data separately from the destructor + * so it can be called when WAYLAND isn't running (immediately before raising an exception). + */ + void display_destroy_and_free_all(); + struct GWL_Display *display_; }; _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs