diff --git a/third_party/angle/src/libANGLE/renderer/vulkan/vk_utils.cpp b/third_party/angle/src/libANGLE/renderer/vulkan/vk_utils.cpp --- a/third_party/angle/src/libANGLE/renderer/vulkan/vk_utils.cpp +++ b/third_party/angle/src/libANGLE/renderer/vulkan/vk_utils.cpp @@ -1968,7 +1968,16 @@ void GetExtentsAndLayerCount(gl::TextureType textureType, vk::LevelIndex GetLevelIndex(gl::LevelIndex levelGL, gl::LevelIndex baseLevel) { - ASSERT(baseLevel <= levelGL); + // SECURITY: glCopy[Sub]TextureCHROMIUM permits a sourceLevel that is below + // the source VkImage's mFirstAllocatedLevel. The GLint subtraction below + // would underflow to ~0xFFFFFFFE and reach vkCmdCopyImage as + // srcSubresource.mipLevel, violating VUID-vkCmdCopyImage-srcSubresource-07967 + // and yielding a driver-side OOB read. Crash safely instead. + if (ANGLE_UNLIKELY(!(baseLevel <= levelGL))) + { + FATAL() << "GetLevelIndex underflow: levelGL=" << levelGL.get() + << " < baseLevel=" << baseLevel.get(); + } return vk::LevelIndex(levelGL.get() - baseLevel.get()); }