Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 60a7bb2

Browse files
author
Jonah Williams
authored
[Impeller] fix NPE caused by implicit sk_sp to fml::Status conversion. (#53177)
nullptr is converted to fml::Status::OK(nullptr), which we don't null check. Change this to consistently use fml::Status Discovered in flutter/flutter#148851
1 parent d1365ee commit 60a7bb2

File tree

3 files changed

+25
-21
lines changed

3 files changed

+25
-21
lines changed

lib/ui/painting/image_encoding.cc

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "flutter/fml/status_or.h"
1515
#include "flutter/fml/trace_event.h"
1616
#include "flutter/lib/ui/painting/image.h"
17+
#include "fml/status.h"
1718
#if IMPELLER_SUPPORTS_RENDERING
1819
#include "flutter/lib/ui/painting/image_encoding_impeller.h"
1920
#endif // IMPELLER_SUPPORTS_RENDERING
@@ -64,16 +65,17 @@ void InvokeDataCallback(std::unique_ptr<DartPersistentValue> callback,
6465
DartInvoke(callback->value(), {dart_data, Dart_Null()});
6566
}
6667

67-
sk_sp<SkData> CopyImageByteData(const sk_sp<SkImage>& raster_image,
68-
SkColorType color_type,
69-
SkAlphaType alpha_type) {
68+
fml::StatusOr<sk_sp<SkData>> CopyImageByteData(
69+
const sk_sp<SkImage>& raster_image,
70+
SkColorType color_type,
71+
SkAlphaType alpha_type) {
7072
FML_DCHECK(raster_image);
7173

7274
SkPixmap pixmap;
7375

7476
if (!raster_image->peekPixels(&pixmap)) {
75-
FML_LOG(ERROR) << "Could not copy pixels from the raster image.";
76-
return nullptr;
77+
return fml::Status(fml::StatusCode::kInternal,
78+
"Could not copy pixels from the raster image.");
7779
}
7880

7981
// The color types already match. No need to swizzle. Return early.
@@ -87,15 +89,15 @@ sk_sp<SkData> CopyImageByteData(const sk_sp<SkImage>& raster_image,
8789
color_type, alpha_type, nullptr));
8890

8991
if (!surface) {
90-
FML_LOG(ERROR) << "Could not set up the surface for swizzle.";
91-
return nullptr;
92+
fml::Status(fml::StatusCode::kInternal,
93+
"Could not set up the surface for swizzle.");
9294
}
9395

9496
surface->writePixels(pixmap, 0, 0);
9597

9698
if (!surface->peekPixels(&pixmap)) {
97-
FML_LOG(ERROR) << "Pixel address is not available.";
98-
return nullptr;
99+
return fml::Status(fml::StatusCode::kInternal,
100+
"Pixel address is not available.");
99101
}
100102

101103
return SkData::MakeWithCopy(pixmap.addr(), pixmap.computeByteSize());
@@ -125,7 +127,8 @@ void EncodeImageAndInvokeDataCallback(
125127
[callback_task = std::move(callback_task), format,
126128
ui_task_runner](const fml::StatusOr<sk_sp<SkImage>>& raster_image) {
127129
if (raster_image.ok()) {
128-
sk_sp<SkData> encoded = EncodeImage(raster_image.value(), format);
130+
fml::StatusOr<sk_sp<SkData>> encoded =
131+
EncodeImage(raster_image.value(), format);
129132
ui_task_runner->PostTask([callback_task = callback_task,
130133
encoded = std::move(encoded)]() mutable {
131134
callback_task(std::move(encoded));
@@ -199,21 +202,21 @@ Dart_Handle EncodeImage(CanvasImage* canvas_image,
199202
return Dart_Null();
200203
}
201204

202-
sk_sp<SkData> EncodeImage(const sk_sp<SkImage>& raster_image,
203-
ImageByteFormat format) {
205+
fml::StatusOr<sk_sp<SkData>> EncodeImage(const sk_sp<SkImage>& raster_image,
206+
ImageByteFormat format) {
204207
TRACE_EVENT0("flutter", __FUNCTION__);
205208

206209
if (!raster_image) {
207-
return nullptr;
210+
return fml::Status(fml::StatusCode::kInternal, "Missing raster image.");
208211
}
209212

210213
switch (format) {
211214
case kPNG: {
212215
auto png_image = SkPngEncoder::Encode(nullptr, raster_image.get(), {});
213216

214217
if (png_image == nullptr) {
215-
FML_LOG(ERROR) << "Could not convert raster image to PNG.";
216-
return nullptr;
218+
return fml::Status(fml::StatusCode::kInternal,
219+
"Could not convert raster image to PNG.");
217220
};
218221
return png_image;
219222
}
@@ -233,8 +236,8 @@ sk_sp<SkData> EncodeImage(const sk_sp<SkImage>& raster_image,
233236
kUnpremul_SkAlphaType);
234237
}
235238

236-
FML_LOG(ERROR) << "Unknown error encoding image.";
237-
return nullptr;
239+
return fml::Status(fml::StatusCode::kInternal,
240+
"Unknown error encoding image.");
238241
}
239242

240243
} // namespace flutter

lib/ui/painting/image_encoding.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#ifndef FLUTTER_LIB_UI_PAINTING_IMAGE_ENCODING_H_
66
#define FLUTTER_LIB_UI_PAINTING_IMAGE_ENCODING_H_
77

8+
#include "fml/status_or.h"
89
#include "third_party/skia/include/core/SkImage.h"
910
#include "third_party/tonic/dart_library_natives.h"
1011

@@ -25,8 +26,8 @@ Dart_Handle EncodeImage(CanvasImage* canvas_image,
2526
int format,
2627
Dart_Handle callback_handle);
2728

28-
sk_sp<SkData> EncodeImage(const sk_sp<SkImage>& raster_image,
29-
ImageByteFormat format);
29+
fml::StatusOr<sk_sp<SkData>> EncodeImage(const sk_sp<SkImage>& raster_image,
30+
ImageByteFormat format);
3031

3132
} // namespace flutter
3233

lib/ui/painting/image_encoding_unittests.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -465,8 +465,8 @@ TEST(ImageEncodingImpellerTest, PngEncoding10XR) {
465465

466466
sk_sp<SkImage> image = surface->makeImageSnapshot();
467467

468-
sk_sp<SkData> png = EncodeImage(image, ImageByteFormat::kPNG);
469-
EXPECT_TRUE(png);
468+
fml::StatusOr<sk_sp<SkData>> png = EncodeImage(image, ImageByteFormat::kPNG);
469+
EXPECT_TRUE(png.ok());
470470
}
471471

472472
#endif // IMPELLER_SUPPORTS_RENDERING

0 commit comments

Comments
 (0)