已开启
[ArkWeb][安全][上游社区漏洞修复][BUG-485622239] 修复Vulkan纹理尺寸溢出 #458
[ArkWeb][安全][上游社区漏洞修复][BUG-485622239] 修复Vulkan纹理尺寸溢出 #458
已开启
创建于 7 天前
。
7 天前

修复说明

本次修复针对 Bug 485622239,解决 ANGLE Vulkan 后端纹理尺寸计算中的 32 位整数溢出问题。

关键代码变更

文件:src/libANGLE/renderer/vulkan/TextureVk.cpp

原代码将宽、高、深、像素字节数与层数一次性相乘:

size_t dstBufferSize = sourceBox.width * sourceBox.height * sourceBox.depth *
                       dstFormat.pixelBytes * layerCount;

以上乘法的中间结果以 32 位有符号整数计算,当纹理尺寸接近规格上限时可能发生溢出,造成缓冲分配不足与内存越界风险。

修复后改为 size_t 分步乘法,并新增编译期断言:

static_assert(gl::IMPLEMENTATION_MAX_2D_TEXTURE_SIZE *
                  gl::IMPLEMENTATION_MAX_2D_TEXTURE_SIZE <
              std::numeric_limits<int32_t>::max());
size_t dstBufferSize = sourceBox.width * sourceBox.height;
static_assert(gl::IMPLEMENTATION_MAX_3D_TEXTURE_SIZE *
                  gl::IMPLEMENTATION_MAX_2D_ARRAY_TEXTURE_LAYERS * 16 <
              std::numeric_limits<int32_t>::max());
dstBufferSize *= sourceBox.depth * dstFormat.pixelBytes * layerCount;

代码逻辑说明:先以 size_t 类型保存宽×高的结果,再累乘深度、像素字节数与层数,全程使用 64 位运算避免中间溢出;两个 static_assert 在编译期验证规格上限下的乘积不会超过 32 位有符号整数范围。

影响评估

  • 影响范围:仅影响 ANGLE Vulkan 后端中纹理数据拷贝/转换路径(TextureVk::stageSubresourceUpdateAndGetData 相关逻辑)
  • 功能影响:尺寸计算方式变化,计算结果在无溢出场景下与原来完全一致,不影响正常纹理操作
  • 性能影响:无额外运行时开销,仅新增编译期断言
  • 兼容性影响:向后兼容,不影响既有纹理规格的合法使用

测试情况

  • 该改动为纯计算逻辑修正,与上游 ANGLE 社区提交一致
  • 分步乘法在正常尺寸下产生的结果与原表达式完全一致,不会改变既有行为
  • 两个 static_assert 已通过编译验证,确认规格上限乘积均在 int32_t 范围内
  • 未新增测试用例,改动已包含于 ANGLE 上游主线并被社区验证

关联Issue

Issue #368(BUG-485622239)

Signed-off-by: xiuwangliu liuxingwang10@h-partners.com


关联Issue: #368

Closes #368

likedislike
合并受阻
openharmony_ci
openharmony_ci成员
7 天前 评论:

感谢提交 Pull Requests!
Thanks for submitting a pull request.

likedislike
openharmony_ciopenharmony_ci成员
7 天前 添加了label:dco检查成功
。
7 天前 修改了pull request 的描述