429 Star 1.6K Fork 1.6K

GVPopenEuler/kernel

 / 详情

【openEuler-1.0-LTS】回合cifs LTS补丁 2fe0e281f7ad,导致memory leak

已完成
任务
创建于  
2022-09-28 16:30

问题现象如下

[root@localhost ~]# echo scan > /sys/kernel/debug/kmemleak 
[root@localhost ~]# cat /sys/kernel/debug/kmemleak
unreferenced object 0xffff8881238de580 (size 512):
  comm "mount.cifs", pid 576, jiffies 4294805132 (age 398.116s)
  hex dump (first 32 bytes):
    00 30 63 10 81 88 ff ff e0 3d 63 10 81 88 ff ff  .0c......=c.....
    00 00 00 00 00 00 00 00 80 31 d1 22 81 88 ff ff  .........1."....
  backtrace:
    [<00000000aa76ee94>] cifs_smb3_do_mount+0xa2/0x5b0
    [<00000000b87d07fd>] mount_fs+0x5c/0x191
    [<000000006a4dd4d9>] vfs_kern_mount.part.0+0x51/0x1b0
    [<000000008da7b30f>] do_mount+0x30b/0x1320
    [<000000009a9aa187>] ksys_mount+0x7e/0xc0
    [<00000000df394707>] __x64_sys_mount+0x62/0x70
    [<0000000063676d8d>] do_syscall_64+0x7b/0x2c0
    [<00000000c2dae16f>] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [<00000000aea7b412>] 0xffffffffffffffff
unreferenced object 0xffff888122d13180 (size 32):
  comm "mount.cifs", pid 576, jiffies 4294805132 (age 398.116s)
  hex dump (first 32 bytes):
    5c 5c 31 39 32 2e 31 36 38 2e 36 38 2e 37 37 5c  \\192.168.68.77\
    54 45 53 54 00 00 00 00 00 00 00 00 00 00 00 00  TEST............
  backtrace:
    [<00000000717a9281>] cifs_parse_mount_options+0x459/0x2230
    [<000000001aa09c5c>] cifs_setup_volume_info+0x1f/0x1f0
    [<00000000c1a42c36>] cifs_get_volume_info+0x4e/0x90
    [<00000000aa76ee94>] cifs_smb3_do_mount+0xa2/0x5b0
    [<00000000b87d07fd>] mount_fs+0x5c/0x191
    [<000000006a4dd4d9>] vfs_kern_mount.part.0+0x51/0x1b0
    [<000000008da7b30f>] do_mount+0x30b/0x1320
    [<000000009a9aa187>] ksys_mount+0x7e/0xc0
    [<00000000df394707>] __x64_sys_mount+0x62/0x70
    [<0000000063676d8d>] do_syscall_64+0x7b/0x2c0
    [<00000000c2dae16f>] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [<00000000aea7b412>] 0xffffffffffffffff
unreferenced object 0xffff888110633000 (size 8):
  comm "mount.cifs", pid 576, jiffies 4294805132 (age 398.116s)
  hex dump (first 8 bytes):
    66 73 67 71 61 00 ff ff                          fsgqa...
  backtrace:
    [<000000006315b419>] cifs_parse_mount_options+0xe5b/0x2230
    [<000000001aa09c5c>] cifs_setup_volume_info+0x1f/0x1f0
    [<00000000c1a42c36>] cifs_get_volume_info+0x4e/0x90
    [<00000000aa76ee94>] cifs_smb3_do_mount+0xa2/0x5b0
    [<00000000b87d07fd>] mount_fs+0x5c/0x191
    [<000000006a4dd4d9>] vfs_kern_mount.part.0+0x51/0x1b0
    [<000000008da7b30f>] do_mount+0x30b/0x1320
    [<000000009a9aa187>] ksys_mount+0x7e/0xc0
    [<00000000df394707>] __x64_sys_mount+0x62/0x70
    [<0000000063676d8d>] do_syscall_64+0x7b/0x2c0
    [<00000000c2dae16f>] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [<00000000aea7b412>] 0xffffffffffffffff
unreferenced object 0xffff888110633de0 (size 8):
  comm "mount.cifs", pid 576, jiffies 4294805132 (age 398.116s)
  hex dump (first 8 bytes):
    68 75 61 77 65 69 00 00                          huawei..
  backtrace:
    [<000000001aa09c5c>] cifs_setup_volume_info+0x1f/0x1f0
    [<00000000c1a42c36>] cifs_get_volume_info+0x4e/0x90
    [<00000000aa76ee94>] cifs_smb3_do_mount+0xa2/0x5b0
    [<00000000b87d07fd>] mount_fs+0x5c/0x191
    [<000000006a4dd4d9>] vfs_kern_mount.part.0+0x51/0x1b0
    [<000000008da7b30f>] do_mount+0x30b/0x1320
    [<000000009a9aa187>] ksys_mount+0x7e/0xc0
    [<00000000df394707>] __x64_sys_mount+0x62/0x70
    [<0000000063676d8d>] do_syscall_64+0x7b/0x2c0
    [<00000000c2dae16f>] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [<00000000aea7b412>] 0xffffffffffffffff
unreferenced object 0xffff88810cf00120 (size 32):
  comm "mount.cifs", pid 701, jiffies 4294848207 (age 355.056s)
  hex dump (first 32 bytes):
    5c 5c 31 39 32 2e 31 36 38 2e 36 38 2e 37 37 5c  \\192.168.68.77\
    54 45 53 54 00 00 00 00 00 00 00 00 00 00 00 00  TEST............
  backtrace:
    [<00000000717a9281>] cifs_parse_mount_options+0x459/0x2230
    [<000000001aa09c5c>] cifs_setup_volume_info+0x1f/0x1f0
    [<00000000c1a42c36>] cifs_get_volume_info+0x4e/0x90
    [<00000000aa76ee94>] cifs_smb3_do_mount+0xa2/0x5b0
    [<00000000b87d07fd>] mount_fs+0x5c/0x191
    [<000000006a4dd4d9>] vfs_kern_mount.part.0+0x51/0x1b0
    [<000000008da7b30f>] do_mount+0x30b/0x1320
    [<000000009a9aa187>] ksys_mount+0x7e/0xc0
    [<00000000df394707>] __x64_sys_mount+0x62/0x70
    [<0000000063676d8d>] do_syscall_64+0x7b/0x2c0
    [<00000000c2dae16f>] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [<00000000aea7b412>] 0xffffffffffffffff
unreferenced object 0xffff88814e6ed180 (size 8):
  comm "mount.cifs", pid 701, jiffies 4294848208 (age 355.055s)
  hex dump (first 8 bytes):
    68 75 61 77 65 69 00 00                          huawei..
  backtrace:
    [<000000001aa09c5c>] cifs_setup_volume_info+0x1f/0x1f0
    [<00000000c1a42c36>] cifs_get_volume_info+0x4e/0x90
    [<00000000aa76ee94>] cifs_smb3_do_mount+0xa2/0x5b0
    [<00000000b87d07fd>] mount_fs+0x5c/0x191
    [<000000006a4dd4d9>] vfs_kern_mount.part.0+0x51/0x1b0
    [<000000008da7b30f>] do_mount+0x30b/0x1320
    [<000000009a9aa187>] ksys_mount+0x7e/0xc0
    [<00000000df394707>] __x64_sys_mount+0x62/0x70
    [<0000000063676d8d>] do_syscall_64+0x7b/0x2c0
    [<00000000c2dae16f>] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [<00000000aea7b412>] 0xffffffffffffffff
unreferenced object 0xffff88810f851680 (size 512):
  comm "mount.cifs", pid 747, jiffies 4295139638 (age 63.625s)
  hex dump (first 32 bytes):
    b0 c4 41 08 81 88 ff ff d0 ce 41 08 81 88 ff ff  ..A.......A.....
    00 00 00 00 00 00 00 00 00 60 7f 02 81 88 ff ff  .........`......
  backtrace:
    [<00000000aa76ee94>] cifs_smb3_do_mount+0xa2/0x5b0
    [<00000000b87d07fd>] mount_fs+0x5c/0x191
    [<000000006a4dd4d9>] vfs_kern_mount.part.0+0x51/0x1b0
    [<000000008da7b30f>] do_mount+0x30b/0x1320
    [<000000009a9aa187>] ksys_mount+0x7e/0xc0
    [<00000000df394707>] __x64_sys_mount+0x62/0x70
    [<0000000063676d8d>] do_syscall_64+0x7b/0x2c0
    [<00000000c2dae16f>] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [<00000000aea7b412>] 0xffffffffffffffff
unreferenced object 0xffff8881027f6000 (size 32):
  comm "mount.cifs", pid 747, jiffies 4295139638 (age 63.625s)
  hex dump (first 32 bytes):
    5c 5c 31 39 32 2e 31 36 38 2e 36 38 2e 37 37 5c  \\192.168.68.77\
    54 45 53 54 00 ff ff ff 50 6a 57 ae ff ff ff ff  TEST....PjW.....
  backtrace:
    [<00000000717a9281>] cifs_parse_mount_options+0x459/0x2230
    [<000000001aa09c5c>] cifs_setup_volume_info+0x1f/0x1f0
    [<00000000c1a42c36>] cifs_get_volume_info+0x4e/0x90
    [<00000000aa76ee94>] cifs_smb3_do_mount+0xa2/0x5b0
    [<00000000b87d07fd>] mount_fs+0x5c/0x191
    [<000000006a4dd4d9>] vfs_kern_mount.part.0+0x51/0x1b0
    [<000000008da7b30f>] do_mount+0x30b/0x1320
    [<000000009a9aa187>] ksys_mount+0x7e/0xc0
    [<00000000df394707>] __x64_sys_mount+0x62/0x70
    [<0000000063676d8d>] do_syscall_64+0x7b/0x2c0
    [<00000000c2dae16f>] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [<00000000aea7b412>] 0xffffffffffffffff
unreferenced object 0xffff88810841c4b0 (size 8):
  comm "mount.cifs", pid 747, jiffies 4295139638 (age 63.640s)
  hex dump (first 8 bytes):
    66 73 67 71 61 00 ff ff                          fsgqa...
  backtrace:
    [<000000006315b419>] cifs_parse_mount_options+0xe5b/0x2230
    [<000000001aa09c5c>] cifs_setup_volume_info+0x1f/0x1f0
    [<00000000c1a42c36>] cifs_get_volume_info+0x4e/0x90
    [<00000000aa76ee94>] cifs_smb3_do_mount+0xa2/0x5b0
    [<00000000b87d07fd>] mount_fs+0x5c/0x191
    [<000000006a4dd4d9>] vfs_kern_mount.part.0+0x51/0x1b0
    [<000000008da7b30f>] do_mount+0x30b/0x1320
    [<000000009a9aa187>] ksys_mount+0x7e/0xc0
    [<00000000df394707>] __x64_sys_mount+0x62/0x70
    [<0000000063676d8d>] do_syscall_64+0x7b/0x2c0
    [<00000000c2dae16f>] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [<00000000aea7b412>] 0xffffffffffffffff
unreferenced object 0xffff88810841ced0 (size 8):
  comm "mount.cifs", pid 747, jiffies 4295139638 (age 63.640s)
  hex dump (first 8 bytes):
    68 75 61 77 65 69 00 00                          huawei..
  backtrace:
    [<000000001aa09c5c>] cifs_setup_volume_info+0x1f/0x1f0
    [<00000000c1a42c36>] cifs_get_volume_info+0x4e/0x90
    [<00000000aa76ee94>] cifs_smb3_do_mount+0xa2/0x5b0
    [<00000000b87d07fd>] mount_fs+0x5c/0x191
    [<000000006a4dd4d9>] vfs_kern_mount.part.0+0x51/0x1b0
    [<000000008da7b30f>] do_mount+0x30b/0x1320
    [<000000009a9aa187>] ksys_mount+0x7e/0xc0
    [<00000000df394707>] __x64_sys_mount+0x62/0x70
    [<0000000063676d8d>] do_syscall_64+0x7b/0x2c0
    [<00000000c2dae16f>] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [<00000000aea7b412>] 0xffffffffffffffff

评论 (3)

LuoMeng 创建了任务 3年前
openeuler-ci-bot 添加了
 
sig/Kernel
标签
3年前

LTS补丁2fe0e281f7ad 分析:
代码分析:

cifs_get_root # 此处失败
deactivate_locked_super
  cifs_kill_sb # 通过 fs->kill_sb 回调
    cifs_umount
      kfree(cifs_sb->prepath); # 已释放一次
       call_rcu(&cifs_sb->rcu, delayed_free)
       smb3_cleanup_fs_context(cifs_sb->ctx)
         kfree(ctx)
         kfree(cifs_sb->prepath); # 重复释放
        smb3_cleanup_fs_context(cifs_sb->ctx);
        kfree(cifs_sb); # 重复释放


delayed_free # 此处会释放
  smb3_cleanup_fs_context(cifs_sb->ctx);

根据上述流程补丁修复了double free的问题

在openEuler-1.0-LTS里流程如下:

cifs_get_root
  deactivate_locked_super
    cifs_kill_sb 
      cifs_umount
        kfree(cifs_sb->mountdata)
        kfree(cifs_sb->prepath)
        call_rcu(&cifs_sb->rcu, delayed_free)
  cifs_cleanup_volume_info(volume_info) # 回合补丁后该分支跳过
    kfree(volume_info)

在4,19的代码逻辑中不会发生double free,而此时若在合入LTS补丁会导致跳过cifs_cleanup_volume_info(),此时会导致memory leak。

登录 后才可以发表评论

状态
负责人
项目
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
预计工期 (小时)
参与者(2)
5329419 openeuler ci bot 1632792936 LuoMeng-Luo_meng_meng
C
1
https://gitee.com/openeuler/kernel.git
git@gitee.com:openeuler/kernel.git
openeuler
kernel
kernel

搜索帮助