登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
Gitee 年度开源项目评选中~
代码拉取完成,页面将自动刷新
仓库状态说明
开源项目
>
其他开源
>
操作系统
&&
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
23
Star
37
Fork
57
openEuler
/
syscare
关闭
代码
Issues
17
Pull Requests
3
Wiki
统计
流水线
服务
JavaDoc
PHPDoc
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
应用补丁段错误
待办的
#IDDN3P
缺陷
wangtsingx
创建于
2025-12-17 17:36
**【缺陷描述】:请补充详细的缺陷问题现象描述** **【问题复现步骤】:请描述具体的操作步骤** 应用补丁段错误 ```bash /usr/libexec/syscare/upatch-manage -v "patch" "--uuid" "57f8f65a-9f8c-4830-a64d-d6d6a90a1b1d" "--pid" "17054" "--binary" "/usr/libexec/qemu-kvm" "--upatch" "/usr/lib/syscare/patches/a3e36dee-2197-4c6f-bea3-54fee2428918/qemu-kvm" ``` **【实际结果】**,请描述出问题的结果和影响 ```bash Attached to 13 thread(s): 17054, 17082, 17087, 17088, 17089, 17090, 17091, 17092, 17094, 17096, 17631, 17634, 17637 load_bias = 560567bf5000 [17054] Stack size 12976, region [0x7ffd411a4d50, 0x7ffd411a8000] [17082] Stack size 8388608, region [0x7fde94212628, 0x7fde94a12628] [17087] Stack size 18446744073709551615, region [0x0, 0xffffffffffffffff] 段错误(核心已转储) ``` **【期望结果】**,请描述出期望的结果和影响 应用补丁成功 **【其他相关附件信息】** 比如系统message日志/组件日志、dump信息、图片等 **【缺陷详情及分析指导参考链接】** 程序在尝试读取进程堆栈时出现了段错误(segmentation fault)。特别注意这一行: ``` [17087] Stack size 18446744073709551615, region [0x0, 0xffffffffffffffff] ``` 这个数值 `18446744073709551615` 等于 `0xFFFFFFFFFFFFFFFF`,也就是 `ULONG_MAX`,这表明 [read_stack](./syscare/upatch-manage/upatch-stack-check.c#L60-L64) 函数或相关代码在读取某个线程的堆栈信息时出现了问题。 这个问题很可能发生在 [upatch-manage](./syscare/upatch-manage/) 模块中,让我们看看相关代码: 根据你的输出和代码分析,问题是由于 [read_stack](./syscare/upatch-manage/upatch-stack-check.c#L60-L64) 函数返回了一个无效的大小值,导致后续的循环出现严重问题。 具体来说,从日志可以看到: ``` [17087] Stack size 18446744073709551615, region [0x0, 0xffffffffffffffff] ``` 这个值实际上是 `SIZE_MAX`(最大的无符号长整数),这表示 [pread](./syscare/syscare-common/src/fs/fs_impl.rs#L245-L245) 系统调用失败并返回了 -1,但是在转换为 [size_t](./syscare/syscare-build/src/patch/kernel_patch/mod.rs#L22-L22) 类型时变成了最大的无符号整数。 在 [upatch-stack-check.c](./syscare/upatch-manage/upatch-stack-check.c) 文件中,[read_stack](./syscare/upatch-manage/upatch-stack-check.c#L60-L64) 函数直接返回 [pread](./syscare/syscare-common/src/fs/fs_impl.rs#L245-L245) 的结果,没有检查错误情况: ```c static size_t read_stack(struct upatch_process *proc, unsigned long *stack, size_t size, unsigned long sp) { return (size_t)pread(proc->memfd, (void *)stack, size, (off_t)sp); } ``` 当 [pread](./syscare/syscare-common/src/fs/fs_impl.rs#L245-L245) 返回 -1 时(表示错误),它被强制转换为 [size_t](./syscare/syscare-build/src/patch/kernel_patch/mod.rs#L22-L22),变成 SIZE_MAX,然后在后续的循环中: ```c for (size_t i = 0; i < stack_size / sizeof(*stack); i++) { ``` 这会导致一个巨大的循环次数,最终导致段错误。 解决方案是在 [read_stack](./syscare/upatch-manage/upatch-stack-check.c#L60-L64) 函数中增加错误检查: ```c static size_t read_stack(struct upatch_process *proc, unsigned long *stack, size_t size, unsigned long sp) { ssize_t result = pread(proc->memfd, (void *)stack, size, (off_t)sp); if (result < 0) { log_error("Failed to read stack from process memory: %s\n", strerror(errno)); return 0; } return (size_t)result; } ``` 并且在调用点也应该检查返回值: ```c stack_size = read_stack(proc, stack, stack_size, sp); if (stack_size == 0) { log_warn("Failed to read stack for PID %d, skipping stack check\n", pid); free(stack); return 0; } ``` 这个 bug 会导致在对某些进程进行热补丁操作时发生段错误,特别是在处理某些特殊线程(比如内核线程或其他特权线程)时,因为这些线程的堆栈可能无法通过 `/proc/<pid>/mem` 正常访问。
**【缺陷描述】:请补充详细的缺陷问题现象描述** **【问题复现步骤】:请描述具体的操作步骤** 应用补丁段错误 ```bash /usr/libexec/syscare/upatch-manage -v "patch" "--uuid" "57f8f65a-9f8c-4830-a64d-d6d6a90a1b1d" "--pid" "17054" "--binary" "/usr/libexec/qemu-kvm" "--upatch" "/usr/lib/syscare/patches/a3e36dee-2197-4c6f-bea3-54fee2428918/qemu-kvm" ``` **【实际结果】**,请描述出问题的结果和影响 ```bash Attached to 13 thread(s): 17054, 17082, 17087, 17088, 17089, 17090, 17091, 17092, 17094, 17096, 17631, 17634, 17637 load_bias = 560567bf5000 [17054] Stack size 12976, region [0x7ffd411a4d50, 0x7ffd411a8000] [17082] Stack size 8388608, region [0x7fde94212628, 0x7fde94a12628] [17087] Stack size 18446744073709551615, region [0x0, 0xffffffffffffffff] 段错误(核心已转储) ``` **【期望结果】**,请描述出期望的结果和影响 应用补丁成功 **【其他相关附件信息】** 比如系统message日志/组件日志、dump信息、图片等 **【缺陷详情及分析指导参考链接】** 程序在尝试读取进程堆栈时出现了段错误(segmentation fault)。特别注意这一行: ``` [17087] Stack size 18446744073709551615, region [0x0, 0xffffffffffffffff] ``` 这个数值 `18446744073709551615` 等于 `0xFFFFFFFFFFFFFFFF`,也就是 `ULONG_MAX`,这表明 [read_stack](./syscare/upatch-manage/upatch-stack-check.c#L60-L64) 函数或相关代码在读取某个线程的堆栈信息时出现了问题。 这个问题很可能发生在 [upatch-manage](./syscare/upatch-manage/) 模块中,让我们看看相关代码: 根据你的输出和代码分析,问题是由于 [read_stack](./syscare/upatch-manage/upatch-stack-check.c#L60-L64) 函数返回了一个无效的大小值,导致后续的循环出现严重问题。 具体来说,从日志可以看到: ``` [17087] Stack size 18446744073709551615, region [0x0, 0xffffffffffffffff] ``` 这个值实际上是 `SIZE_MAX`(最大的无符号长整数),这表示 [pread](./syscare/syscare-common/src/fs/fs_impl.rs#L245-L245) 系统调用失败并返回了 -1,但是在转换为 [size_t](./syscare/syscare-build/src/patch/kernel_patch/mod.rs#L22-L22) 类型时变成了最大的无符号整数。 在 [upatch-stack-check.c](./syscare/upatch-manage/upatch-stack-check.c) 文件中,[read_stack](./syscare/upatch-manage/upatch-stack-check.c#L60-L64) 函数直接返回 [pread](./syscare/syscare-common/src/fs/fs_impl.rs#L245-L245) 的结果,没有检查错误情况: ```c static size_t read_stack(struct upatch_process *proc, unsigned long *stack, size_t size, unsigned long sp) { return (size_t)pread(proc->memfd, (void *)stack, size, (off_t)sp); } ``` 当 [pread](./syscare/syscare-common/src/fs/fs_impl.rs#L245-L245) 返回 -1 时(表示错误),它被强制转换为 [size_t](./syscare/syscare-build/src/patch/kernel_patch/mod.rs#L22-L22),变成 SIZE_MAX,然后在后续的循环中: ```c for (size_t i = 0; i < stack_size / sizeof(*stack); i++) { ``` 这会导致一个巨大的循环次数,最终导致段错误。 解决方案是在 [read_stack](./syscare/upatch-manage/upatch-stack-check.c#L60-L64) 函数中增加错误检查: ```c static size_t read_stack(struct upatch_process *proc, unsigned long *stack, size_t size, unsigned long sp) { ssize_t result = pread(proc->memfd, (void *)stack, size, (off_t)sp); if (result < 0) { log_error("Failed to read stack from process memory: %s\n", strerror(errno)); return 0; } return (size_t)result; } ``` 并且在调用点也应该检查返回值: ```c stack_size = read_stack(proc, stack, stack_size, sp); if (stack_size == 0) { log_warn("Failed to read stack for PID %d, skipping stack check\n", pid); free(stack); return 0; } ``` 这个 bug 会导致在对某些进程进行热补丁操作时发生段错误,特别是在处理某些特殊线程(比如内核线程或其他特权线程)时,因为这些线程的堆栈可能无法通过 `/proc/<pid>/mem` 正常访问。
评论 (
2
)
登录
后才可以发表评论
状态
待办的
待办的
已挂起
修复中
已确认
已完成
已验收
已取消
负责人
未设置
标签
sig/sig-ops
未设置
项目
未立项任务
未立项任务
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
分支 (11)
标签 (5)
master
uprobe
openEuler-24.03-LTS-SP2
openEuler-24.03-LTS-SP1
openEuler-24.03-LTS
openEuler-25.03
openEuler-22.03
openEuler-20.03
openEuler-24.09
risvcport
dev
v1.2.2-4
v1.2.2-5
v1.2.2-3
v1.2.2-1
v1.2.1-1
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
预计工期
(小时)
参与者(1)
1
https://gitee.com/openeuler/syscare.git
git@gitee.com:openeuler/syscare.git
openeuler
syscare
syscare
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册