From ce10462a1dd7cd16984c2530728a72f7fe855a2d Mon Sep 17 00:00:00 2001 From: Callum Moffat Date: Thu, 8 Sep 2022 20:14:57 -0400 Subject: [PATCH] Fix crash on ImageFilter.blur with very small sigma (flutter/engine#35890) --- .../flutter/display_list/display_list_image_filter.h | 6 +++++- .../display_list_image_filter_unittests.cc | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/engine/src/flutter/display_list/display_list_image_filter.h b/engine/src/flutter/display_list/display_list_image_filter.h index c495c4cf098..4f48414b88a 100644 --- a/engine/src/flutter/display_list/display_list_image_filter.h +++ b/engine/src/flutter/display_list/display_list_image_filter.h @@ -712,7 +712,11 @@ class DlLocalMatrixImageFilter final : public DlImageFilter { if (!image_filter_) { return nullptr; } - return image_filter_->skia_object()->makeWithLocalMatrix(matrix_); + sk_sp skia_object = image_filter_->skia_object(); + if (!skia_object) { + return nullptr; + } + return skia_object->makeWithLocalMatrix(matrix_); } protected: diff --git a/engine/src/flutter/display_list/display_list_image_filter_unittests.cc b/engine/src/flutter/display_list/display_list_image_filter_unittests.cc index f3f2507cf3b..b3e646fdacb 100644 --- a/engine/src/flutter/display_list/display_list_image_filter_unittests.cc +++ b/engine/src/flutter/display_list/display_list_image_filter_unittests.cc @@ -846,6 +846,16 @@ TEST(DisplayListImageFilter, LocalImageFilterBounds) { } } +TEST(DisplayListImageFilter, LocalImageSkiaNull) { + auto blur_filter = + std::make_shared(0, 0, DlTileMode::kClamp); + DlLocalMatrixImageFilter dl_local_matrix_filter(SkMatrix::RotateDeg(45), + blur_filter); + // With sigmas set to zero on the blur filter, Skia will return a null filter. + // The local matrix filter should return nullptr instead of crashing. + ASSERT_EQ(dl_local_matrix_filter.skia_object(), nullptr); +} + TEST(DisplayListImageFilter, UnknownEquals) { sk_sp sk_filter = SkImageFilters::Blur(5.0, 6.0, SkTileMode::kRepeat, nullptr);