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>