From f4a6928117c8d4452693a9ad74e9039f5c57b10e Mon Sep 17 00:00:00 2001 From: Joe Downing Date: Wed, 8 Jun 2022 15:57:43 -0700 Subject: [PATCH] Simple, mergable fix to avoid a libyuv CopyPlane crash Bug: chromium:1330019 Change-Id: I1a22967dff3231c1522fb94de38b309f441d468e Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/265442 Reviewed-by: Frank Barchard Reviewed-by: Alexander Cooper Commit-Queue: Joe Downing Cr-Commit-Position: refs/heads/main@{#37158} --- modules/desktop_capture/desktop_frame.cc | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/modules/desktop_capture/desktop_frame.cc b/modules/desktop_capture/desktop_frame.cc index 6e24fab4b5..837cbfca89 100644 --- a/modules/desktop_capture/desktop_frame.cc +++ b/modules/desktop_capture/desktop_frame.cc @@ -45,9 +45,13 @@ void DesktopFrame::CopyPixelsFrom(const uint8_t* src_buffer, RTC_CHECK(DesktopRect::MakeSize(size()).ContainsRect(dest_rect)); uint8_t* dest = GetFrameDataAtPos(dest_rect.top_left()); - libyuv::CopyPlane(src_buffer, src_stride, dest, stride(), - DesktopFrame::kBytesPerPixel * dest_rect.width(), - dest_rect.height()); + // TODO(crbug.com/1330019): Temporary workaround for a known libyuv crash when + // the height or width is 0. Remove this once this change has been merged. + if (dest_rect.width() && dest_rect.height()) { + libyuv::CopyPlane(src_buffer, src_stride, dest, stride(), + DesktopFrame::kBytesPerPixel * dest_rect.width(), + dest_rect.height()); + } } void DesktopFrame::CopyPixelsFrom(const DesktopFrame& src_frame, @@ -157,9 +161,13 @@ BasicDesktopFrame::~BasicDesktopFrame() { // static DesktopFrame* BasicDesktopFrame::CopyOf(const DesktopFrame& frame) { DesktopFrame* result = new BasicDesktopFrame(frame.size()); - libyuv::CopyPlane(frame.data(), frame.stride(), result->data(), - result->stride(), frame.size().width() * kBytesPerPixel, - frame.size().height()); + // TODO(crbug.com/1330019): Temporary workaround for a known libyuv crash when + // the height or width is 0. Remove this once this change has been merged. + if (frame.size().width() && frame.size().height()) { + libyuv::CopyPlane(frame.data(), frame.stride(), result->data(), + result->stride(), frame.size().width() * kBytesPerPixel, + frame.size().height()); + } result->CopyFrameInfoFrom(frame); return result; }