Valdis reported a BUG in ipv6_add_addr:
[ 1820.832682] BUG: unable to handle kernel NULL pointer dereference at
0000000000000209
[ 1820.832728] RIP: 0010:ipv6_add_addr+0x280/0xd10
[ 1820.832732] Code: 49 8b 1f 0f 84 6a 0a 00 00 48 85 db 0f 84 4e 0a 00 00 48 8b 03 48 8b 53 08 49 89 45 00 49 8b 47 10
49 89 55 08 48 85 c0 74 15 <48> 8b 50 08 48 8b 00 49 89 95 b8 01 00 00 49 89 85 b0 01 00 00 4c
[ 1820.832847] RSP: 0018:
ffffaa07c2fd7880 EFLAGS:
00010202
[ 1820.832853] RAX:
0000000000000201 RBX:
ffffaa07c2fd79b0 RCX:
0000000000000000
[ 1820.832858] RDX:
a4cfbfba2cbfa64c RSI:
0000000000000000 RDI:
ffffffff8a8e9fa0
[ 1820.832862] RBP:
ffffaa07c2fd7920 R08:
000000000000017a R09:
ffffffff8a555300
[ 1820.832866] R10:
0000000000000000 R11:
0000000000000000 R12:
ffff888d18e71c00
[ 1820.832871] R13:
ffff888d0a9b1200 R14:
0000000000000000 R15:
ffffaa07c2fd7980
[ 1820.832876] FS:
00007faa51bdb800(0000) GS:
ffff888d1d400000(0000) knlGS:
0000000000000000
[ 1820.832880] CS: 0010 DS: 0000 ES: 0000 CR0:
0000000080050033
[ 1820.832885] CR2:
0000000000000209 CR3:
000000021e8f8001 CR4:
00000000001606e0
[ 1820.832888] Call Trace:
[ 1820.832898] ? __local_bh_enable_ip+0x119/0x260
[ 1820.832904] ? ipv6_create_tempaddr+0x259/0x5a0
[ 1820.832912] ? __local_bh_enable_ip+0x139/0x260
[ 1820.832921] ipv6_create_tempaddr+0x2da/0x5a0
[ 1820.832926] ? ipv6_create_tempaddr+0x2da/0x5a0
[ 1820.832941] manage_tempaddrs+0x1a5/0x240
[ 1820.832951] inet6_addr_del+0x20b/0x3b0
[ 1820.832959] ? nla_parse+0xce/0x1e0
[ 1820.832968] inet6_rtm_deladdr+0xd9/0x210
[ 1820.832981] rtnetlink_rcv_msg+0x1d4/0x5f0
Looking at the code I found 1 element (peer_pfx) of the newly introduced
ifa6_config struct that is not initialized. Use a memset rather than hard
coding an init for each struct element.
Reported-by: Valdis Kletnieks <valdis.kletnieks@vt.edu>
Fixes: e6464b8c63619 ("net/ipv6: Convert ipv6_add_addr to struct ifa6_config")
Signed-off-by: David Ahern <dsahern@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
}
}
+ memset(&cfg, 0, sizeof(cfg));
cfg.valid_lft = min_t(__u32, ifp->valid_lft,
idev->cnf.temp_valid_lft + age);
cfg.preferred_lft = cnf_temp_preferred_lft + age - idev->desync_factor;
cfg.pfx = &addr;
cfg.scope = ipv6_addr_scope(cfg.pfx);
- cfg.rt_priority = 0;
ift = ipv6_add_addr(idev, &cfg, block, NULL);
if (IS_ERR(ift)) {