[RHEL7,COMMIT] ms/net: sysctl: fix a kmemleak warning

Submitted by Konstantin Khorenko on Nov. 15, 2017, 1:14 p.m.

Details

Message ID 201711151314.vAFDEuA7012137@finist_ce7.work
State New
Series "Series without cover letter"
Headers show

Commit Message

Konstantin Khorenko Nov. 15, 2017, 1:14 p.m.
The commit is pushed to "branch-rh7-3.10.0-693.1.1.vz7.37.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-693.1.1.vz7.37.28
------>
commit 547f849066c5ea7ca6485aef69bcce3fbe193b22
Author: Li RongQing <roy.qing.li@gmail.com>
Date:   Wed Nov 15 16:14:56 2017 +0300

    ms/net: sysctl: fix a kmemleak warning
    
    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: Li RongQing <roy.qing.li@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    
    https://jira.sw.ru/browse/PSBM-76924
    (cherry picked from commit ce9d9b8e5c2b7486edf76958bcdb5e6534a915b0)
    Signed-off-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
---
 net/sysctl_net.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

Patch hide | download patch | download mbox

diff --git a/net/sysctl_net.c b/net/sysctl_net.c
index 42279fd..62eb022 100644
--- a/net/sysctl_net.c
+++ b/net/sysctl_net.c
@@ -94,10 +94,14 @@  __init int net_sysctl_init(void)
 		goto out;
 	ret = register_pernet_subsys(&sysctl_pernet_ops);
 	if (ret)
-		goto out;
+		goto out1;
 	register_sysctl_root(&net_sysctl_root);
 out:
 	return ret;
+out1:
+	unregister_sysctl_table(net_header);
+	net_header = NULL;
+	goto out;
 }
 
 struct ctl_table_header *register_net_sysctl(struct net *net,