已合并
fix: harden path validation in reselect_static_kernel_with_path #40493
rich创建于 7月8日
fix: harden path validation in reselect_static_kernel_with_path #40493
已合并
rich创建于 7月8日
rich
rich成员
7月8日

【合入来源】

如有社区issue,请关联issue链接
请勿携带内部流程信息(需求链接、问题单、内部issue等)

https://gitcode.com/Ascend/pytorch/issues/2634
https://gitcode.com/Ascend/pytorch/pull/40386

【修改方案】

请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列
如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容)

1.路径规范化与解析增强: 在 Module.cpp 中,使用 realpath() 将用户输入的路径解析为绝对路径 abs_path,再基于 abs_path 进行 stat 存在性检查和 S_ISDIR 目录类型判断,并将解析后的路径传入后续的 lambda 和 API 调用,防止原始路径中的符号链接或相对路径绕过校验。
2.新增边界条件单元测试: 在 test_npu_static_kernel.py 中新增 4 个测试用例,分别覆盖路径非字符串、路径含空字节、路径不存在、路径为文件而非目录的场景,验证各类非法输入均抛出 RuntimeError。
3.函数指针判空逻辑调整: 在 OpInterface.cpp 的 ReselectStaticKernelWithPath 中,将 TORCH_CHECK 判空检查移入 if 分支内部,仅在函数指针未初始化时才执行校验,避免重复检查。
4.接口注释修正: 在 OpInterface.h 中移除了 ReselectStaticKernelWithPath 文档注释中“it need to be called once at process”的过时描述。
5.测试文件存量lint检查修正:去除未使用的import,修改一个重复定义bug。

【资料变更】

请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及”

不涉及

【接口变更】

请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及”

不涉及

【功能验证】

说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤
新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图

新增UT补充

(zrq_310_29) root@xxx:xxx# python /xxx/torch_npu/test/_inductor/test_npu_static_kernel.py
/xxx/lib/python3.10/site-packages/torch_npu/_inductor/__init__.py:97: UserWarning: triton-ascend is not installed, install it first.
  warnings.warn("triton-ascend is not installed, install it first.")
..........
----------------------------------------------------------------------
Ran 10 tests in 0.593s

OK

【CheckList】

PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x]

likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 rich 的贡献)
richrich成员
7月8日 创建了 pull request,commit 70852fed
richrich成员
7月8日 关联了issue:[Feature]: 静态编译支持按进程隔离
atomgit-bot
atomgit-bot
7月8日 评论:

变更摘要

此 PR 主要对 reselect_static_kernel_with_path 接口的路径参数进行了安全性加固:使用 realpath() 将用户输入的路径规范化为绝对路径后再进行校验和使用,防止路径遍历、符号链接等潜在风险;同时补充了相应的单元测试用例覆盖边界情况。

主要改动

  • 路径解析与校验加固:在 Module.cppTHNPModule_aclnn_reselect_static_kernel_with_path 中,用 realpath() 替换原有的直接 stat() 调用,将输入路径解析为规范化的绝对路径 abs_path,并将存在性检查与目录类型检查合并为一条 TORCH_CHECK,错误信息从 "path does not exist" 改为 "failed to resolve path"
  • 下游使用规范化路径Module.cpp 中 lambda 捕获和后续 ReselectStaticKernelWithPath 调用均改用 resolved_path(即 realpath 解析后的绝对路径),避免原始未验证路径被传递到后端。
  • OpInterface.cpp 空指针检查位置修正:将 aclnnReselectStaticKernelWithPathFuncTORCH_CHECK 空指针检查移入 if 块内部,仅在首次加载函数指针后立即校验,逻辑更紧凑。
  • OpInterface.h 注释简化:移除 ReselectStaticKernelWithPath 文档注释中“it need to be called once at process”的冗余描述。
  • 新增单元测试:在 test_npu_static_kernel.py 中新增 4 个测试用例,覆盖传入非字符串类型、含空字节的路径、不存在的路径、以及文件而非目录等异常输入场景。
likedislike
atomgit-bot
atomgit-bot
7月8日 评论:

代码审查

经过对所有 4 个变更文件的逐行审查,包括:

  • test/_inductor/test_npu_static_kernel.py:4 个新增测试方法均正确匹配对应 C++ 代码中的错误消息,异常类型、边界值覆盖完整。
  • torch_npu/csrc/core/npu/interface/OpInterface.cpp:将 TORCH_CHECK 移入 if 块内是正确的优化——仅在首次加载函数指针时检查,加载失败则通过 TORCH_CHECK 抛出,不会到达后续的空指针解引用;后续调用因指针非空直接跳过检查。
  • torch_npu/csrc/core/npu/interface/OpInterface.h:仅修改注释,移除"仅需调用一次"的过时描述,与 PR 的进程级隔离目标一致。
  • torch_npu/csrc/npu/Module.cpprealpath + PATH_MAX 缓冲区进行路径规范化和存在性验证是安全的;空字节检测在前、目录类型检测在后,层次正确;lambda 按值捕获 resolved_path 保证异步安全;两分支均使用规范化后的绝对路径,消除了符号链接/相对路径绕过风险。

未发现任何正确性、安全性、可靠性或破坏性变更问题。

审查总结

  • P0: 0
  • P1: 0
  • P2: 0
  • P3: 0

整体风险评估:此变更风险极低,路径验证逻辑的强化(statrealpath)和函数指针检查位置的修正是合理且安全的质量改进。新增测试覆盖了类型检查、空字节注入、路径不存在、文件/目录类型四个边界场景。无需阻塞合入。

⚠️ 已识别出整体风险,但无法提取行内评论,请参考整体评估。

likedislike
此处折叠了45条消息 查看更多
wjlflyer成员
7月8日 评论:

/lgtm

likedislike
liujunzhu
liujunzhu成员
7月8日 评论:

/approve

likedislike
ascend-robotascend-robot成员
7月8日 添加了label:approvedlgtm
ascend-robotascend-robot成员
7月8日 合入了pull request
wjlflyer成员
7月8日 评论:

/approve

likedislike