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); Gdk::KEY_PRESS_MASK | Gdk::KEY_RELEASE_MASK);
} }
GtkCanvas::~GtkCanvas ()
{
_in_dtor = true;
#ifdef __APPLE__
if (_nsglview) {
Gtkmm2ext::nsglview_destroy (_nsglview);
}
#endif
}
void void
GtkCanvas::set_single_exposure (bool yn) GtkCanvas::set_single_exposure (bool yn)
{ {

View file

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

View file

@ -26,9 +26,11 @@ namespace Gtkmm2ext
class CairoCanvas; class CairoCanvas;
void* nsglview_create (CairoCanvas*, bool use_backing_scale); void* nsglview_create (CairoCanvas*, bool use_backing_scale);
void nsglview_destroy (void*);
void nsglview_overlay (void*, GdkWindow*); void nsglview_overlay (void*, GdkWindow*);
void nsglview_resize (void*, int x, int y, int w, int h); 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_queue_draw (void*, int x, int y, int w, int h);
void nsglview_set_visible (void*, bool); void nsglview_set_visible (void*, bool);
} }
#endif #endif

View file

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