Handle failed Realize() in MakeCachedImage()

Checks for a successful Realize() result in MakeCachedImage(), before
trying to construct a CachedImage from it (which would crash if given a
nullptr).

This only affects the Skia code path, as the AGG code path returns the
Realize() result directly.

No test added because triggering Realize() failure requires hard-to-test
conditions like running out of memory.

Fixed: chromium:1467034
Change-Id: I0d089035cf5a83f8fbf87b55c2e6edf5394e7ee5
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/110190
Reviewed-by: Nigi <nigi@chromium.org>
Commit-Queue: K. Moon <kmoon@chromium.org>
Auto-Submit: K. Moon <kmoon@chromium.org>
Commit-Queue: Nigi <nigi@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_pageimagecache.cpp b/core/fpdfapi/page/cpdf_pageimagecache.cpp
index e470169..cebb8b1 100644
--- a/core/fpdfapi/page/cpdf_pageimagecache.cpp
+++ b/core/fpdfapi/page/cpdf_pageimagecache.cpp
@@ -113,8 +113,13 @@
     // TODO(crbug.com/pdfium/2050): Ignore `realize_hint`, as `RealizeSkImage()`
     // doesn't benefit from it. The current behavior masks a bug in `CPDF_DIB`
     // in which `GetBuffer()` and `GetScanline()` don't give the same answer.
-    return pdfium::MakeRetain<CachedImage>(realize_hint ? image->Realize()
-                                                        : std::move(image));
+    if (realize_hint) {
+      image = image->Realize();
+      if (!image) {
+        return nullptr;
+      }
+    }
+    return pdfium::MakeRetain<CachedImage>(std::move(image));
   }
 #endif  // defined(_SKIA_SUPPORT_)
   return realize_hint ? image->Realize() : image;