Skip to content
  • Li RongQing's avatar
    net: sysctl: fix a kmemleak warning · ce9d9b8e
    Li RongQing authored
    
    
    the returned buffer of register_sysctl() is stored into net_header
    variable, but net_header is not used after, and compiler maybe
    optimise the variable out, and lead kmemleak reported the below warning
    
    	comm "swapper/0", pid 1, jiffies 4294937448 (age 267.270s)
    	hex dump (first 32 bytes):
    	90 38 8b 01 c0 ff ff ff 00 00 00 00 01 00 00 00 .8..............
    	01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
    	backtrace:
    	[<ffffffc00020f134>] create_object+0x10c/0x2a0
    	[<ffffffc00070ff44>] kmemleak_alloc+0x54/0xa0
    	[<ffffffc0001fe378>] __kmalloc+0x1f8/0x4f8
    	[<ffffffc00028e984>] __register_sysctl_table+0x64/0x5a0
    	[<ffffffc00028eef0>] register_sysctl+0x30/0x40
    	[<ffffffc00099c304>] net_sysctl_init+0x20/0x58
    	[<ffffffc000994dd8>] sock_init+0x10/0xb0
    	[<ffffffc0000842e0>] do_one_initcall+0x90/0x1b8
    	[<ffffffc000966bac>] kernel_init_freeable+0x218/0x2f0
    	[<ffffffc00070ed6c>] kernel_init+0x1c/0xe8
    	[<ffffffc000083bfc>] ret_from_fork+0xc/0x50
    	[<ffffffffffffffff>] 0xffffffffffffffff <<end check kmemleak>>
    
    Before fix, the objdump result on ARM64:
    0000000000000000 <net_sysctl_init>:
       0:   a9be7bfd        stp     x29, x30, [sp,#-32]!
       4:   90000001        adrp    x1, 0 <net_sysctl_init>
       8:   90000000        adrp    x0, 0 <net_sysctl_init>
       c:   910003fd        mov     x29, sp
      10:   91000021        add     x1, x1, #0x0
      14:   91000000        add     x0, x0, #0x0
      18:   a90153f3        stp     x19, x20, [sp,#16]
      1c:   12800174        mov     w20, #0xfffffff4                // #-12
      20:   94000000        bl      0 <register_sysctl>
      24:   b4000120        cbz     x0, 48 <net_sysctl_init+0x48>
      28:   90000013        adrp    x19, 0 <net_sysctl_init>
      2c:   91000273        add     x19, x19, #0x0
      30:   9101a260        add     x0, x19, #0x68
      34:   94000000        bl      0 <register_pernet_subsys>
      38:   2a0003f4        mov     w20, w0
      3c:   35000060        cbnz    w0, 48 <net_sysctl_init+0x48>
      40:   aa1303e0        mov     x0, x19
      44:   94000000        bl      0 <register_sysctl_root>
      48:   2a1403e0        mov     w0, w20
      4c:   a94153f3        ldp     x19, x20, [sp,#16]
      50:   a8c27bfd        ldp     x29, x30, [sp],#32
      54:   d65f03c0        ret
    After:
    0000000000000000 <net_sysctl_init>:
       0:   a9bd7bfd        stp     x29, x30, [sp,#-48]!
       4:   90000000        adrp    x0, 0 <net_sysctl_init>
       8:   910003fd        mov     x29, sp
       c:   a90153f3        stp     x19, x20, [sp,#16]
      10:   90000013        adrp    x19, 0 <net_sysctl_init>
      14:   91000000        add     x0, x0, #0x0
      18:   91000273        add     x19, x19, #0x0
      1c:   f90013f5        str     x21, [sp,#32]
      20:   aa1303e1        mov     x1, x19
      24:   12800175        mov     w21, #0xfffffff4                // #-12
      28:   94000000        bl      0 <register_sysctl>
      2c:   f9002260        str     x0, [x19,#64]
      30:   b40001a0        cbz     x0, 64 <net_sysctl_init+0x64>
      34:   90000014        adrp    x20, 0 <net_sysctl_init>
      38:   91000294        add     x20, x20, #0x0
      3c:   9101a280        add     x0, x20, #0x68
      40:   94000000        bl      0 <register_pernet_subsys>
      44:   2a0003f5        mov     w21, w0
      48:   35000080        cbnz    w0, 58 <net_sysctl_init+0x58>
      4c:   aa1403e0        mov     x0, x20
      50:   94000000        bl      0 <register_sysctl_root>
      54:   14000004        b       64 <net_sysctl_init+0x64>
      58:   f9402260        ldr     x0, [x19,#64]
      5c:   94000000        bl      0 <unregister_sysctl_table>
      60:   f900227f        str     xzr, [x19,#64]
      64:   2a1503e0        mov     w0, w21
      68:   f94013f5        ldr     x21, [sp,#32]
      6c:   a94153f3        ldp     x19, x20, [sp,#16]
      70:   a8c37bfd        ldp     x29, x30, [sp],#48
      74:   d65f03c0        ret
    
    Add the possible error handle to free the net_header to remove the
    kmemleak warning
    
    Signed-off-by: default avatarLi RongQing <roy.qing.li@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    ce9d9b8e