登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
Gitee 年度开源项目评选中~
代码拉取完成,页面将自动刷新
仓库状态说明
开源项目
>
其他开源
>
操作系统
&&
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
170
Star
435
Fork
1.6K
openEuler
/
community
关闭
代码
Issues
660
Pull Requests
14
Wiki
统计
流水线
服务
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
linux内核 在申请0长度的dma时panic
待办的
#IBHRZP
内核缺陷
贺杰安
创建于
2025-01-14 17:25
> _**请尽量提供详细的信息,如缺乏必要的定位信息,则缺陷不会被定位**_ ## 环境信息 【OS版本】Linux (none) 6.6.0 #16 SMP Tue Jan 14 10:40:22 CST 2025 aarch64 GNU/Linux 【内核版本】多版本存在,包括linux-master 【硬件平台】 不涉及 【组网信息】不涉及 ## 缺陷信息 【问题复现步骤】 1. dma_alloc_coherent传递0作为长度 【实际结果】请描述出问题的结果和影响 预计返回NUll 【期望结果】请描述出期望的结果和影响 发生Oops导致内核崩溃 【其他相关附件信息 # 这里可以附上相关文本信息 [ 2860.573350][ T400] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000010 [ 2860.573367][ T400] Mem abort info: [ 2860.573379][ T400] ESR = 0x0000000096000006 [ 2860.573392][ T400] EC = 0x25: DABT (current EL), IL = 32 bits [ 2860.573407][ T400] SET = 0, FnV = 0 [ 2860.573420][ T400] EA = 0, S1PTW = 0 [ 2860.573434][ T400] FSC = 0x06: level 2 translation fault [ 2860.573448][ T400] Data abort info: [ 2860.573460][ T400] ISV = 0, ISS = 0x00000006, ISS2 = 0x00000000 [ 2860.573475][ T400] CM = 0, WnR = 0, TnD = 0, TagAccess = 0 [ 2860.573491][ T400] GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0 [ 2860.573506][ T400] user pgtable: 4k pages, 48-bit VAs, pgdp=000008009c237000 [ 2860.573523][ T400] [0000000000000010] pgd=080008009c250403, p4d=080008009c250403, pud=080008009c22c403, pmd=0000000000000000 [ 2860.573664][ T400] pc : sg_alloc_append_table_from_pages+0x208/0x430 [ 2860.573680][ T400] lr : sg_alloc_append_table_from_pages+0x2c8/0x430 [ 2860.573695][ T400] sp : ffff800081a0b770 [ 2860.573704][ T400] x29: ffff800081a0b770 x28: 0000000000000001 x27: 0000000000000000 [ 2860.573724][ T400] x26: 0000000000000000 x25: 0000000000000001 x24: 0000000000000000 [ 2860.573744][ T400] x23: 0000000000000000 x22: ffff080097664b20 x21: 00000000fffff000 [ 2860.573764][ T400] x20: 0000000000000000 x19: 0000000000000010 x18: 0000000000000000 [ 2860.573784][ T400] x17: 0000000000000000 x16: ffffd7c64b5a7e38 x15: 0000fffff7ccae20 [ 2860.573805][ T400] x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000 [ 2860.573824][ T400] x11: 0000000000000000 x10: 0000000000000000 x9 : ffffd7c64b83a574 [ 2860.573845][ T400] x8 : ffff080097664b40 x7 : 0000000000000000 x6 : 000000000000cbe5 [ 2860.573865][ T400] x5 : ffffd7c64d18a8f0 x4 : 0000000000000000 x3 : 0000000000000001 [ 2860.573885][ T400] x2 : 0000000000000000 x1 : 0000000000000002 x0 : 0000000000000001 [ 2860.573905][ T400] Call trace: [ 2860.573912][ T400] sg_alloc_append_table_from_pages+0x208/0x430 [ 2860.573927][ T400] sg_alloc_table_from_pages_segment+0x3c/0xa0 [ 2860.573943][ T400] __iommu_dma_alloc_noncontiguous.constprop.0+0x130/0x278 [ 2860.573960][ T400] iommu_dma_alloc+0x174/0x228 [ 2860.573973][ T400] dma_alloc_attrs+0xf4/0x108 【已分析信息】如已经做过分析和定位,请尽量附上详细的分析结果 通过调用栈定位到函数__iommu_dma_alloc_noncontiguous, 此函数内调用__iommu_dma_alloc_pages, 且长度是用户传递来的,可能为0,当size为0时候,__iommu_dma_alloc_pages的count入参为0:  此函数内部使用kvcalloc申请内存,kvcalloc实际上是对kmalloc的封装,当count为0是实际上调用了kmalloc(0, gfp), 这返回的是ZERO_SIZE_PTR(他是 (void*)16而不是0)。 因此使用!pages校验会失败,随后填信息的时候对pages解引用就是对ZERO_SIZE_PTR解引用,从而引发Oops。
> _**请尽量提供详细的信息,如缺乏必要的定位信息,则缺陷不会被定位**_ ## 环境信息 【OS版本】Linux (none) 6.6.0 #16 SMP Tue Jan 14 10:40:22 CST 2025 aarch64 GNU/Linux 【内核版本】多版本存在,包括linux-master 【硬件平台】 不涉及 【组网信息】不涉及 ## 缺陷信息 【问题复现步骤】 1. dma_alloc_coherent传递0作为长度 【实际结果】请描述出问题的结果和影响 预计返回NUll 【期望结果】请描述出期望的结果和影响 发生Oops导致内核崩溃 【其他相关附件信息 # 这里可以附上相关文本信息 [ 2860.573350][ T400] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000010 [ 2860.573367][ T400] Mem abort info: [ 2860.573379][ T400] ESR = 0x0000000096000006 [ 2860.573392][ T400] EC = 0x25: DABT (current EL), IL = 32 bits [ 2860.573407][ T400] SET = 0, FnV = 0 [ 2860.573420][ T400] EA = 0, S1PTW = 0 [ 2860.573434][ T400] FSC = 0x06: level 2 translation fault [ 2860.573448][ T400] Data abort info: [ 2860.573460][ T400] ISV = 0, ISS = 0x00000006, ISS2 = 0x00000000 [ 2860.573475][ T400] CM = 0, WnR = 0, TnD = 0, TagAccess = 0 [ 2860.573491][ T400] GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0 [ 2860.573506][ T400] user pgtable: 4k pages, 48-bit VAs, pgdp=000008009c237000 [ 2860.573523][ T400] [0000000000000010] pgd=080008009c250403, p4d=080008009c250403, pud=080008009c22c403, pmd=0000000000000000 [ 2860.573664][ T400] pc : sg_alloc_append_table_from_pages+0x208/0x430 [ 2860.573680][ T400] lr : sg_alloc_append_table_from_pages+0x2c8/0x430 [ 2860.573695][ T400] sp : ffff800081a0b770 [ 2860.573704][ T400] x29: ffff800081a0b770 x28: 0000000000000001 x27: 0000000000000000 [ 2860.573724][ T400] x26: 0000000000000000 x25: 0000000000000001 x24: 0000000000000000 [ 2860.573744][ T400] x23: 0000000000000000 x22: ffff080097664b20 x21: 00000000fffff000 [ 2860.573764][ T400] x20: 0000000000000000 x19: 0000000000000010 x18: 0000000000000000 [ 2860.573784][ T400] x17: 0000000000000000 x16: ffffd7c64b5a7e38 x15: 0000fffff7ccae20 [ 2860.573805][ T400] x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000 [ 2860.573824][ T400] x11: 0000000000000000 x10: 0000000000000000 x9 : ffffd7c64b83a574 [ 2860.573845][ T400] x8 : ffff080097664b40 x7 : 0000000000000000 x6 : 000000000000cbe5 [ 2860.573865][ T400] x5 : ffffd7c64d18a8f0 x4 : 0000000000000000 x3 : 0000000000000001 [ 2860.573885][ T400] x2 : 0000000000000000 x1 : 0000000000000002 x0 : 0000000000000001 [ 2860.573905][ T400] Call trace: [ 2860.573912][ T400] sg_alloc_append_table_from_pages+0x208/0x430 [ 2860.573927][ T400] sg_alloc_table_from_pages_segment+0x3c/0xa0 [ 2860.573943][ T400] __iommu_dma_alloc_noncontiguous.constprop.0+0x130/0x278 [ 2860.573960][ T400] iommu_dma_alloc+0x174/0x228 [ 2860.573973][ T400] dma_alloc_attrs+0xf4/0x108 【已分析信息】如已经做过分析和定位,请尽量附上详细的分析结果 通过调用栈定位到函数__iommu_dma_alloc_noncontiguous, 此函数内调用__iommu_dma_alloc_pages, 且长度是用户传递来的,可能为0,当size为0时候,__iommu_dma_alloc_pages的count入参为0:  此函数内部使用kvcalloc申请内存,kvcalloc实际上是对kmalloc的封装,当count为0是实际上调用了kmalloc(0, gfp), 这返回的是ZERO_SIZE_PTR(他是 (void*)16而不是0)。 因此使用!pages校验会失败,随后填信息的时候对pages解引用就是对ZERO_SIZE_PTR解引用,从而引发Oops。
评论 (
1
)
登录
后才可以发表评论
状态
待办的
待办的
已挂起
进行中
已拒绝
已完成
负责人
未设置
标签
sig/TC
未设置
项目
未立项任务
未立项任务
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
未关联
master
revert-merge-6093-master
revert-merge-6149-master
revert-merge-2745-master
revert-merge-2733-master
revert-merge-2642-master
revert-merge-1991-master
feature/test_branch
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
预计工期
(小时)
参与者(1)
Go
1
https://gitee.com/openeuler/community.git
git@gitee.com:openeuler/community.git
openeuler
community
community
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册