Pass retained arguments to CFX_ClipRgn::IntersectMaskF(). In turn, pass retained arguments to IntersectMaskRect(). Doing so avoids the need for a "stack protector" when re-assigning on top of the original holder of the object itself. Bug: pdfium:1843 Change-Id: Ifb649ab8edb3118faff5c297b51c4dc949c4dba3 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/95510 Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxge/agg/fx_agg_driver.cpp b/core/fxge/agg/fx_agg_driver.cpp index 6e9e5d0..4f8028e 100644 --- a/core/fxge/agg/fx_agg_driver.cpp +++ b/core/fxge/agg/fx_agg_driver.cpp
@@ -1120,7 +1120,8 @@ agg::scanline_u8 scanline; agg::render_scanlines(rasterizer, scanline, final_render, m_FillOptions.aliased_path); - m_pClipRgn->IntersectMaskF(path_rect.left, path_rect.top, pThisLayer); + m_pClipRgn->IntersectMaskF(path_rect.left, path_rect.top, + std::move(pThisLayer)); } bool CFX_AggDeviceDriver::SetClip_PathFill(
diff --git a/core/fxge/cfx_cliprgn.cpp b/core/fxge/cfx_cliprgn.cpp index 79555d8..92c2dc5 100644 --- a/core/fxge/cfx_cliprgn.cpp +++ b/core/fxge/cfx_cliprgn.cpp
@@ -31,7 +31,7 @@ void CFX_ClipRgn::IntersectMaskRect(FX_RECT rect, FX_RECT mask_rect, - const RetainPtr<CFX_DIBitmap>& pMask) { + RetainPtr<CFX_DIBitmap> pOldMask) { m_Type = kMaskF; m_Box = rect; m_Box.Intersect(mask_rect); @@ -40,10 +40,9 @@ return; } if (m_Box == mask_rect) { - m_Mask = pMask; + m_Mask = std::move(pOldMask); return; } - RetainPtr<CFX_DIBitmap> pOldMask(pMask); m_Mask = pdfium::MakeRetain<CFX_DIBitmap>(); m_Mask->Create(m_Box.Width(), m_Box.Height(), FXDIB_Format::k8bppMask); const int offset = m_Box.left - mask_rect.left; @@ -58,12 +57,12 @@ void CFX_ClipRgn::IntersectMaskF(int left, int top, - const RetainPtr<CFX_DIBitmap>& pMask) { + RetainPtr<CFX_DIBitmap> pMask) { DCHECK_EQ(pMask->GetFormat(), FXDIB_Format::k8bppMask); FX_RECT mask_box(left, top, left + pMask->GetWidth(), top + pMask->GetHeight()); if (m_Type == kRectI) { - IntersectMaskRect(m_Box, mask_box, pMask); + IntersectMaskRect(m_Box, mask_box, std::move(pMask)); return; }
diff --git a/core/fxge/cfx_cliprgn.h b/core/fxge/cfx_cliprgn.h index 5738a88..b176765 100644 --- a/core/fxge/cfx_cliprgn.h +++ b/core/fxge/cfx_cliprgn.h
@@ -25,12 +25,12 @@ RetainPtr<CFX_DIBitmap> GetMask() const { return m_Mask; } void IntersectRect(const FX_RECT& rect); - void IntersectMaskF(int left, int top, const RetainPtr<CFX_DIBitmap>& Mask); + void IntersectMaskF(int left, int top, RetainPtr<CFX_DIBitmap> Mask); private: void IntersectMaskRect(FX_RECT rect, FX_RECT mask_rect, - const RetainPtr<CFX_DIBitmap>& Mask); + RetainPtr<CFX_DIBitmap> pOldMask); ClipType m_Type = kRectI; FX_RECT m_Box;
diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp index 3d5cfbc..95fd036 100644 --- a/core/fxge/skia/fx_skia_device.cpp +++ b/core/fxge/skia/fx_skia_device.cpp
@@ -1981,7 +1981,8 @@ SkPaint paint; paint.setAntiAlias(!m_FillOptions.aliased_path); canvas->drawPath(path, paint); - m_pClipRgn->IntersectMaskF(path_rect.left, path_rect.top, pThisLayer); + m_pClipRgn->IntersectMaskF(path_rect.left, path_rect.top, + std::move(pThisLayer)); } #endif // defined(_SKIA_SUPPORT_PATHS_)