Release NSGLView, fixes heap-use-after-free

This commit is contained in:
Robin Gareus 2024-12-06 18:52:04 +01:00
parent 2c01adbeb0
commit 4866baacf5
No known key found for this signature in database
GPG key ID: A090BCE02CF57F04
4 changed files with 21 additions and 1 deletions

View file

@ -562,6 +562,16 @@ GtkCanvas::GtkCanvas ()
Gdk::KEY_PRESS_MASK | Gdk::KEY_RELEASE_MASK);
}
GtkCanvas::~GtkCanvas ()
{
_in_dtor = true;
#ifdef __APPLE__
if (_nsglview) {
Gtkmm2ext::nsglview_destroy (_nsglview);
}
#endif
}
void
GtkCanvas::set_single_exposure (bool yn)
{

View file

@ -218,7 +218,7 @@ class LIBCANVAS_API GtkCanvas : public Canvas, public Gtk::EventBox, public Gtkm
{
public:
GtkCanvas ();
~GtkCanvas () { _in_dtor = true ; }
~GtkCanvas ();
void use_nsglview (bool retina = true);

View file

@ -26,9 +26,11 @@ namespace Gtkmm2ext
class CairoCanvas;
void* nsglview_create (CairoCanvas*, bool use_backing_scale);
void nsglview_destroy (void*);
void nsglview_overlay (void*, GdkWindow*);
void nsglview_resize (void*, int x, int y, int w, int h);
void nsglview_queue_draw (void*, int x, int y, int w, int h);
void nsglview_set_visible (void*, bool);
}
#endif

View file

@ -396,6 +396,14 @@ Gtkmm2ext::nsglview_create (Gtkmm2ext::CairoCanvas* canvas, bool use_backing_sca
return gl_view;
}
void
Gtkmm2ext::nsglview_destroy (void* glv)
{
ArdourCanvasOpenGLView* gl_view = (ArdourCanvasOpenGLView*) glv;
[gl_view removeFromSuperview];
[gl_view release];
}
void
Gtkmm2ext::nsglview_overlay (void* glv, GdkWindow* window)
{