From bca689b4838f3d516c9a35ab7afe8a94c47d3691 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Sun, 19 Feb 2023 12:08:17 +0100 Subject: [PATCH] [widget] Properly test for and handle errors in target-surface creation and mapping. --- widget/windows/TaskbarPreview.cpp | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/widget/windows/TaskbarPreview.cpp b/widget/windows/TaskbarPreview.cpp index 502b47964d..ec182d8ae0 100644 --- a/widget/windows/TaskbarPreview.cpp +++ b/widget/windows/TaskbarPreview.cpp @@ -355,32 +355,38 @@ TaskbarPreviewCallback::Done(nsISupports *aCanvas, bool aDrawBorder) { } RefPtr target = new gfxWindowsSurface(source->GetSize(), gfx::SurfaceFormat::A8R8G8B8_UINT32); - if (!target) { + if (target->CairoStatus() != CAIRO_STATUS_SUCCESS) { return NS_ERROR_FAILURE; } - RefPtr srcSurface = source->GetDataSurface(); + using DataSrcSurf = gfx::DataSourceSurface; + RefPtr srcSurface = source->GetDataSurface(); RefPtr imageSurface = target->GetAsImageSurface(); if (!srcSurface || !imageSurface) { return NS_ERROR_FAILURE; } - gfx::DataSourceSurface::MappedSurface sourceMap; - srcSurface->Map(gfx::DataSourceSurface::READ, &sourceMap); - mozilla::gfx::CopySurfaceDataToPackedArray(sourceMap.mData, - imageSurface->Data(), - srcSurface->GetSize(), - sourceMap.mStride, - BytesPerPixel(srcSurface->GetFormat())); - srcSurface->Unmap(); + DataSrcSurf::ScopedMap const sourceMap(srcSurface, DataSrcSurf::READ); + if (sourceMap.IsMapped()) { + mozilla::gfx::CopySurfaceDataToPackedArray(sourceMap.GetData(), + imageSurface->Data(), + srcSurface->GetSize(), + sourceMap.GetStride(), + BytesPerPixel(srcSurface->GetFormat())); + } else if (source->GetSize().IsEmpty()) { + // A zero-size source-surface probably shouldn't happen, but is harmless + // here. Fall through. + } else { + return NS_ERROR_FAILURE; + } HDC hDC = target->GetDC(); HBITMAP hBitmap = (HBITMAP)GetCurrentObject(hDC, OBJ_BITMAP); DWORD flags = aDrawBorder ? DWM_SIT_DISPLAYFRAME : 0; - POINT pptClient = { 0, 0 }; HRESULT hr; if (!mIsThumbnail) { + POINT pptClient = { 0, 0 }; hr = WinUtils::dwmSetIconicLivePreviewBitmapPtr(mPreview->PreviewWindow(), hBitmap, &pptClient, flags); } else { @@ -388,6 +394,7 @@ TaskbarPreviewCallback::Done(nsISupports *aCanvas, bool aDrawBorder) { hBitmap, flags); } MOZ_ASSERT(SUCCEEDED(hr)); + mozilla::Unused << hr; return NS_OK; }