From a96511e36737284589361616f4fb4c0874095da7 Mon Sep 17 00:00:00 2001 From: Jordan Halase Date: Tue, 22 Oct 2019 14:54:47 -0500 Subject: Fix puglFreeView() crashes when window creation failed --- pugl/detail/mac.m | 27 +++++++++++++++++---------- pugl/detail/win.c | 5 ++++- pugl/detail/x11.c | 10 +++++++--- 3 files changed, 28 insertions(+), 14 deletions(-) (limited to 'pugl') diff --git a/pugl/detail/mac.m b/pugl/detail/mac.m index ab13452..c9847eb 100644 --- a/pugl/detail/mac.m +++ b/pugl/detail/mac.m @@ -818,17 +818,24 @@ puglHideWindow(PuglView* view) void puglFreeViewInternals(PuglView* view) { - view->backend->destroy(view); - [view->impl->wrapperView removeFromSuperview]; - view->impl->wrapperView->puglview = NULL; - if (view->impl->window) { - [view->impl->window close]; - } - [view->impl->wrapperView release]; - if (view->impl->window) { - [view->impl->window release]; + if (view) { + if (view->backend) { + view->backend->destroy(view); + } + + if (view->impl) { + [view->impl->wrapperView removeFromSuperview]; + view->impl->wrapperView->puglview = NULL; + if (view->impl->window) { + [view->impl->window close]; + } + [view->impl->wrapperView release]; + if (view->impl->window) { + [view->impl->window release]; + } + free(view->impl); + } } - free(view->impl); } PuglStatus diff --git a/pugl/detail/win.c b/pugl/detail/win.c index 90c133f..408e7ba 100644 --- a/pugl/detail/win.c +++ b/pugl/detail/win.c @@ -211,7 +211,10 @@ void puglFreeViewInternals(PuglView* view) { if (view) { - view->backend->destroy(view); + if (view->backend) { + view->backend->destroy(view); + } + ReleaseDC(view->impl->hwnd, view->impl->hdc); DestroyWindow(view->impl->hwnd); free(view->impl); diff --git a/pugl/detail/x11.c b/pugl/detail/x11.c index 429d89f..7bf5223 100644 --- a/pugl/detail/x11.c +++ b/pugl/detail/x11.c @@ -266,12 +266,16 @@ puglHideWindow(PuglView* view) void puglFreeViewInternals(PuglView* view) { - if (view) { + if (view && view->impl) { if (view->impl->xic) { XDestroyIC(view->impl->xic); } - view->backend->destroy(view); - XDestroyWindow(view->impl->display, view->impl->win); + if (view->backend) { + view->backend->destroy(view); + } + if (view->impl->display) { + XDestroyWindow(view->impl->display, view->impl->win); + } XFree(view->impl->vi); free(view->impl); } -- cgit v1.2.1