mirror of
https://github.com/openharmony/accesscontrol_sandbox_manager.git
synced 2026-08-25 11:39:38 -04:00
master
Unlink symlink before delete sandbox Created-by: gcw_vVJz6kSm Commit-by: gcw_vVJz6kSm Merged-by: openharmony_ci Description: ### 关联的issue:https://gitcode.com/openharmony/accesscontrol_sandbox_manager/issues/357 ### 修改描述(修改功能描述,规格变更说明): ### 测试用例(附上截图,不涉及不需要说明不涉及原因): 1、TDD: 2、XTS:不涉及 3、手工用例(自验证步骤/预期结果/实际结果):不涉及 ### 兼容性上库自检: - [x] 不涉及组件视觉效果发生变化 - [x] 不涉及组件布局调整 - [x] 不涉及组件交互体验发生变化 - [x] 不涉及组件动效发生变化 - [x] 不涉及组件无障碍、适老化、全球化规格变化 - [x] 不涉及API功能发生变化 - [x] 不涉及改变回调函数或生命周期的触发时机或时序,或删除生命周期和回调函数 - [x] 不涉及参数的规格发生了变化,例如取值范围缩小等 - [x] 不涉及对外接口新增权限校验 - [x] 不涉及接口的使用约束规格收紧,例如权限开放范围变化 - [x] 不涉及系统可创建的实例数量收紧 - [x] 不涉及修改了接口返回的数据 - [x] 未新增错误抛出,包括新增错误码、对已有的场景从不会抛错误码变成会抛出错误 - [x] 未修改已有的错误码,对于相同的输入原本抛出A错误码变成了抛出B错误码 - [x] 接口性能未出现明显劣化 ### 安全编码自检: - [x] 裸指针避免通过隐式转换构造为sptr - [x] json对象在取值之前必须先判断类型,避免类型不匹配 - [x] 序列化时必须对传入的数组大小进行校验,避免出现超大数组 - [x] 避免使用未明确位宽的整型,选择使用int8_t、uint8_t等类型 - [x] 外部传入的路径要做规范化校验,对路径中的.、..、../等特殊字符严格校验 - [x] 指针变量、表示资源描述符的变量、bool变量必须赋初值 - [x] readParcelable获取的对象使用前需要判空 - [x] 分配和释放内存的函数需要成对出现 - [x] 申请内存后异常退出前需要及时进行内存释放 - [x] 内存申请前必须对内存大小进行合法性校验 - [x] 内存分配后必须判断是否成功 - [x] 禁止打印文件路径、口令等敏感信息,如有需要,使用private修饰 - [x] 禁止打印内存地址 - [x] 整数之间运算时必须严格检查,确保不会出现溢出、反转、除0 - [x] 禁止对有符号整数进行位操作符运算 - [x] 循环次数如果收外部数据控制,需要检验其合法性 - [x] 必须检查安全函数的返回值,并进行正确处理 ### 日志规范自检: - [x] 【规则】高频代码的正常流程中禁止打印日志 - [x] 【规则】在基本不可能发生的点必须要打印日志 - [x] 【规则】事件记录的日志使用who do what 主谓宾的形式打印 - [x] 【规则】状态变化的日志打印使用state_name:s1->s2, reason:msg的形式打印 - [x] 【规则】参数值的日志打印使用name1=value1, name2=value2…的形式打印 ### 是否已执行L0用例 - [x] 已验证 - [ ] 不涉及。如不涉及,请写明理由 一、基本信息 ┌──────────┬─────────────────────────────────────────────────────────────────────┐ │ 项 │ 内容 │ ├──────────┼─────────────────────────────────────────────────────────────────────┤ │ commit │bb3d6fdUnlink symlink before delete sandbox │ ├──────────┼─────────────────────────────────────────────────────────────────────┤ │ 父提交 │0ee5682(!418 merge bugfix1 into master) │ ├──────────┼─────────────────────────────────────────────────────────────────────┤ │ 改动文件 │ modules/claw_sandbox/src/sandbox_manager.cpp(1 个文件,+39 / −26) │ ├──────────┼─────────────────────────────────────────────────────────────────────┤ │ 对外接口 │ SandboxManager::DeleteSandboxDir(),未变(无头文件改动) │ └──────────┴─────────────────────────────────────────────────────────────────────┘ 二、变更内容 1. 拆分函数:DeleteSandboxDir() 拆出文件级 static 自由函数 RemoveSandboxDirTree()(41 行),主函数保留校验流程后委托调用(27 行),均满足 50 行约束。 2. 核心功能:remove_all 之前用 unlink() 递归删除沙箱目录树内所有软链接。 3. 顺带修复:一处 std::cerr 续行 << 从行首移到行尾(风格)。 三、问题清单 🔴 无阻塞问题 🟡 主要问题 无。 🟢 次要 / 建议(按优先级) 1.【需业务确认】unlink 前置删除的动机需明确 std::filesystem::remove_all 本身并不跟随符号链接(只删除链接本身)。若本次要修的场景是"软链接指向仍挂载的挂载点导致 remove_all 失败",则 unlink 只删链接、不会卸载挂载点,真正的挂载清理仍需另行处理。建议在 commit message 或注释里写明实际缺陷现象,确认该方案能覆盖根因。 回复:因remove_all无法移除symlink,需要提前unlink。 2.【次要】unlink() 返回值未检查 循环内 unlink(it->path().c_str()) 返回值被忽略。若失败(如 EPERM),软链接残留,最终由 remove_all 兜底上报错误——功能上可接受(错误不会静默消失),但建议对返回值做检查或加注释说明是 best-effort。 回复:沙箱销毁流程,unlink如果失败则remove_all失败,结果一致,不影响其它逻辑,只做尽力而为的销毁。 3.【建议】遍历中途错误被静默吞掉 循环条件 !ec 使遍历出错时提前退出,随后不检查 ec 直接进入 remove_all。若中途读目录出错(如权限),部分软链接未删,remove_all 仍会尽力删除。可接受,但建议补充注释说明该循环是尽力而为。 回复:沙箱销毁流程,unlink如果失败则remove_all失败,结果一致,不影响其它逻辑,只做尽力而为的销毁。 四、正面确认项 - ✅ 正确性:recursive_directory_iterator 默认不进入目录软链接,unlink 只删链接本身,不会沿链接走出沙箱或死循环。 - ✅ 健壮性:全程使用 error_code 重载,不抛异常;skip_permission_denied 容忍无权限子目录。 - ✅ 依赖齐全:unlink/<unistd.h>、<filesystem>、<sys/stat.h> 均已 include,可编译。 - ✅ 风格:static 自由函数写法与 IsDirectoryExist/TrimEnvKey 等既有 helper 一致;行数达标;无行首运算符。 - ✅ 无头文件/对外接口变更;无其它文件受影响。 五、结论 建议合入。无阻塞和主要问题。 See merge request: openharmony/accesscontrol_sandbox_manager!421
Description
沙箱管控策略的持久化管理与策略下发
Languages
C++
98.3%
C
1.7%