From bfac3b3d31abe7c5e40b22d9cd934e6b5399d175 Mon Sep 17 00:00:00 2001 From: Lee Salzman Date: Fri, 19 Sep 2025 17:55:23 +0000 Subject: [PATCH] Bug 1989127. r=ahale a=dmeehan Differential Revision: https://phabricator.services.mozilla.com/D265372 --- dom/canvas/TexUnpackBlob.cpp | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/dom/canvas/TexUnpackBlob.cpp b/dom/canvas/TexUnpackBlob.cpp index 815ca11c4618..32945feb52fd 100644 --- a/dom/canvas/TexUnpackBlob.cpp +++ b/dom/canvas/TexUnpackBlob.cpp @@ -404,7 +404,7 @@ bool TexUnpackBlob::ConvertIfNeeded( const auto& unpacking = mDesc.unpacking; - if (!rowLength || !rowCount) return true; + if (!rowLength || !rowCount || srcStride <= 0 || dstStride <= 0) return true; const auto srcIsPremult = (mDesc.srcAlphaType == gfxAlphaType::Premult); auto dstIsPremult = unpacking.premultiplyAlpha; @@ -997,9 +997,20 @@ bool TexUnpackSurface::TexOrSubImage(bool isSubImage, bool needsRespec, const auto& data = sdb.data(); MOZ_ASSERT(data.type() == layers::MemoryOrShmem::TShmem); const auto& shmem = data.get_Shmem(); - surf = gfx::Factory::CreateWrappingDataSourceSurface( - shmem.get(), layers::ImageDataSerializer::GetRGBStride(rgb), + size_t shmemSize = shmem.Size(); + int32_t stride = layers::ImageDataSerializer::GetRGBStride(rgb); + if (stride <= 0) { + gfxCriticalError() << "TexUnpackSurface failed to get rgb stride"; + return false; + } + size_t bufSize = layers::ImageDataSerializer::ComputeRGBBufferSize( rgb.size(), rgb.format()); + if (!bufSize || bufSize > shmemSize) { + gfxCriticalError() << "TexUnpackSurface failed to get rgb buffer size"; + return false; + } + surf = gfx::Factory::CreateWrappingDataSourceSurface( + shmem.get(), stride, rgb.size(), rgb.format()); } else if (SDIsNullRemoteDecoder(sd)) { const auto& sdrd = sd.get_SurfaceDescriptorGPUVideo() .get_SurfaceDescriptorRemoteDecoder(); @@ -1106,12 +1117,10 @@ bool TexUnpackSurface::TexOrSubImage(bool isSubImage, bool needsRespec, // - const auto dstFormat = FormatForPackingInfo(dstPI); - const auto dstBpp = BytesPerPixel(dstPI); + const size_t dstBpp = BytesPerPixel(dstPI); const size_t dstUsedBytesPerRow = dstBpp * surf->GetSize().width; - auto dstStride = dstUsedBytesPerRow; - if (dstFormat == srcFormat) { - dstStride = srcStride; // Try to match. - } + size_t dstStride = dstFormat == srcFormat ? srcStride // Try To match + : dstUsedBytesPerRow; // -