From e87ea7389b48c6facc50ba7cbb26fe82ea7b825a Mon Sep 17 00:00:00 2001 From: Paul Cornett Date: Thu, 7 Nov 2019 11:26:10 -0800 Subject: [PATCH] Avoid inadvertently destroying a shared PangoContext on GTK2 wxMemoryDC and wxScreenDC dtors were freeing a context they didn't own, potentially causing a crash. Fixed by having the base wxWindowDC dtor free the context. See #18566 --- src/gtk/dataview.cpp | 1 + src/gtk/dcclient.cpp | 7 +++++++ src/gtk/dcmemory.cpp | 1 - src/gtk/dcscreen.cpp | 2 -- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index eb2d5d9106..17c68517b5 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -2629,6 +2629,7 @@ public: m_window = window; m_context = window->GTKGetPangoDefaultContext(); + g_object_ref(m_context); m_layout = pango_layout_new( m_context ); m_fontdesc = pango_font_description_copy(gtk_widget_get_style(widget)->font_desc); diff --git a/src/gtk/dcclient.cpp b/src/gtk/dcclient.cpp index 04d228e63c..66f0e14f65 100644 --- a/src/gtk/dcclient.cpp +++ b/src/gtk/dcclient.cpp @@ -304,6 +304,7 @@ wxWindowDCImpl::wxWindowDCImpl( wxDC *owner, wxWindow *window ) : } m_context = window->GTKGetPangoDefaultContext(); + g_object_ref(m_context); m_layout = pango_layout_new( m_context ); m_fontdesc = pango_font_description_copy( widget->style->font_desc ); @@ -344,6 +345,8 @@ wxWindowDCImpl::~wxWindowDCImpl() { Destroy(); + if (m_context) + g_object_unref(m_context); if (m_layout) g_object_unref (m_layout); if (m_fontdesc) @@ -1539,6 +1542,10 @@ void wxWindowDCImpl::SetFont( const wxFont &font ) // at least, and it doesn't hurt to do it. if (oldContext != m_context) { + g_object_ref(m_context); + if (oldContext) + g_object_unref(oldContext); + if (m_layout) g_object_unref (m_layout); diff --git a/src/gtk/dcmemory.cpp b/src/gtk/dcmemory.cpp index 9ac137d837..f2e20da024 100644 --- a/src/gtk/dcmemory.cpp +++ b/src/gtk/dcmemory.cpp @@ -40,7 +40,6 @@ wxMemoryDCImpl::wxMemoryDCImpl( wxMemoryDC *owner, wxDC *WXUNUSED(dc) ) wxMemoryDCImpl::~wxMemoryDCImpl() { - g_object_unref(m_context); } void wxMemoryDCImpl::Init() diff --git a/src/gtk/dcscreen.cpp b/src/gtk/dcscreen.cpp index ea9f607ed9..1041e4fcca 100644 --- a/src/gtk/dcscreen.cpp +++ b/src/gtk/dcscreen.cpp @@ -50,8 +50,6 @@ void wxScreenDCImpl::Init() wxScreenDCImpl::~wxScreenDCImpl() { - g_object_unref(m_context); - gdk_gc_set_subwindow( m_penGC, GDK_CLIP_BY_CHILDREN ); gdk_gc_set_subwindow( m_brushGC, GDK_CLIP_BY_CHILDREN ); gdk_gc_set_subwindow( m_textGC, GDK_CLIP_BY_CHILDREN );