From ff4cd704122d7c60eda92ef7757060c97a324bf5 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 3 Sep 2021 00:28:58 +0200 Subject: [PATCH] Avoid crash in wxBitmap::GetImage() for invalid bitmaps Just return NULL from this (wxOSX private, in spite of not using a port-specific prefix) method. This fixes crash in wxButton::SetBitmapXXX(wxNullBitmap), as shown by the new test case which used to crash but doesn't do it any longer. Closes #19257. --- include/wx/osx/bitmap.h | 1 + src/osx/core/bitmap.cpp | 2 +- tests/controls/buttontest.cpp | 5 +++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/include/wx/osx/bitmap.h b/include/wx/osx/bitmap.h index d1388a85fb..6484a5e7e2 100644 --- a/include/wx/osx/bitmap.h +++ b/include/wx/osx/bitmap.h @@ -204,6 +204,7 @@ public: // returns a CGImageRef which must released after usage with CGImageRelease CGImageRef CreateCGImage() const ; + // returns nil for invalid bitmap WXImage GetImage() const; #if wxOSX_USE_COCOA // returns an autoreleased version of the image diff --git a/src/osx/core/bitmap.cpp b/src/osx/core/bitmap.cpp index cb9f2163e3..b4e8163c6f 100644 --- a/src/osx/core/bitmap.cpp +++ b/src/osx/core/bitmap.cpp @@ -951,7 +951,7 @@ bool wxBitmap::Create(CGContextRef bitmapcontext) WXImage wxBitmap::GetImage() const { - return GetBitmapData()->GetImage(); + return IsOk() ? GetBitmapData()->GetImage() : NULL; } wxBitmap wxBitmap::GetSubBitmap(const wxRect &rect) const diff --git a/tests/controls/buttontest.cpp b/tests/controls/buttontest.cpp index c6a5725646..4a13623a6d 100644 --- a/tests/controls/buttontest.cpp +++ b/tests/controls/buttontest.cpp @@ -160,6 +160,11 @@ TEST_CASE_METHOD(ButtonTestCase, "Button::Bitmap", "[button]") // updating the bitmap later, as it used to be the case in wxGTK (#18898). m_button->SetLabel(wxString()); CHECK_NOTHROW( m_button->Disable() ); + + // Also check that setting an invalid bitmap doesn't do anything untoward, + // such as crashing, as it used to do in wxOSX (#19257). + CHECK_NOTHROW( m_button->SetBitmapPressed(wxNullBitmap) ); + CHECK( !m_button->GetBitmapPressed().IsOk() ); } #endif //wxUSE_BUTTON