When I attempted to connect to a virt_wifi device using iw on 6.17-rc5, a page fault occurred in __cfg80211_connect_result(), preventing successful connection. The page fault is triggered because virt_wifi_connect_complete() sets requested_bss to NULL when no BSSID is specified. This patch fixes the bug by adding a check for a NULL connected_addr before calling ether_addr_copy() in __cfg80211_connect_result(). Reproduction: root@host:~# modprobe virt_wifi root@host:~# ip tuntap add tap0 mode tap root@host:~# ip link set tap0 up root@host:~# ip link add link tap0 name wlan0 type virt_wifi root@host:~# iw dev wlan0 scan root@host:~# iw dev wlan0 connect "VirtWifi" Kernel panic occurred after running the connect command. Below is panic messages from kernel: [ 150.197544] BUG: kernel NULL pointer dereference, address: 0000000000000000 [ 150.199333] #PF: supervisor read access in kernel mode [ 150.199787] #PF: error_code(0x0000) - not-present page [ 150.200148] PGD 0 P4D 0 [ 150.200339] Oops: Oops: 0000 [#1] SMP NOPTI [ 150.200641] CPU: 0 UID: 0 PID: 78 Comm: kworker/u4:5 Not tainted 6.17.0-rc5 #5 PREEMPT(voluntary) [ 150.201264] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014 [ 150.202056] Workqueue: cfg80211 cfg80211_event_work [cfg80211] [ 150.202528] RIP: 0010:__cfg80211_connect_result+0x35d/0xa40 [cfg80211] [ 150.203032] Code: 8d 14 db 49 89 84 d6 00 04 00 00 41 0f b7 44 24 68 41 83 c5 01 44 89 eb 66 85 c0 75 b6 48 85 db 74 c0 41 80 8e a4 00 00 00 01 <41> 8b 07c [ 150.204305] RSP: 0018:ffffc9000069bd10 EFLAGS: 00010202 [ 150.204670] RAX: 0000000000000000 RBX: 0000000000000001 RCX: 0000000000000000 [ 150.205169] RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffff888110e1f830 [ 150.205666] RBP: ffffc9000069bd90 R08: ffffffff0000afd4 R09: 0000000000000003 [ 150.206169] R10: 0000000000000001 R11: 0000000000000000 R12: ffff8881065e4c18 [ 150.206670] R13: 0000000000000001 R14: ffff888110e1f000 R15: 0000000000000000 [ 150.207165] FS: 0000000000000000(0000) GS:ffff8881f7c3e000(0000) knlGS:0000000000000000 [ 150.207723] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 150.208129] CR2: 0000000000000000 CR3: 000000010577d004 CR4: 0000000000372ef0 [ 150.208627] Call Trace: [ 150.208811] [ 150.208972] ? wakeup_preempt+0x74/0x80 [ 150.209262] cfg80211_process_wdev_events+0x13c/0x1b0 [cfg80211] [ 150.209738] ? cfg80211_process_wdev_events+0x13c/0x1b0 [cfg80211] [ 150.210219] cfg80211_process_rdev_events+0x2f/0x50 [cfg80211] [ 150.210766] cfg80211_event_work+0x3a/0x60 [cfg80211] [ 150.211323] process_scheduled_works+0xa3/0x420 [ 150.211806] worker_thread+0x12a/0x270 [ 150.212170] kthread+0x10d/0x230 [ 150.212460] ? __pfx_worker_thread+0x10/0x10 [ 150.212770] ? __pfx_kthread+0x10/0x10 [ 150.213043] ret_from_fork+0x8c/0x100 [ 150.213322] ? __pfx_kthread+0x10/0x10 [ 150.213595] ret_from_fork_asm+0x1a/0x30 [ 150.213911] [ 150.214076] Modules linked in: virt_wifi cfg80211 intel_rapl_msr intel_rapl_common intel_uncore_frequency_common kvm_intel kvm bochs drm_client_lib drm_sh4 [ 150.216925] CR2: 0000000000000000 [ 150.217176] ---[ end trace 0000000000000000 ]--- [ 150.217526] RIP: 0010:__cfg80211_connect_result+0x35d/0xa40 [cfg80211] [ 150.218120] Code: 8d 14 db 49 89 84 d6 00 04 00 00 41 0f b7 44 24 68 41 83 c5 01 44 89 eb 66 85 c0 75 b6 48 85 db 74 c0 41 80 8e a4 00 00 00 01 <41> 8b 07c [ 150.219483] RSP: 0018:ffffc9000069bd10 EFLAGS: 00010202 [ 150.219863] RAX: 0000000000000000 RBX: 0000000000000001 RCX: 0000000000000000 [ 150.220372] RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffff888110e1f830 [ 150.220874] RBP: ffffc9000069bd90 R08: ffffffff0000afd4 R09: 0000000000000003 [ 150.221379] R10: 0000000000000001 R11: 0000000000000000 R12: ffff8881065e4c18 [ 150.221899] R13: 0000000000000001 R14: ffff888110e1f000 R15: 0000000000000000 [ 150.222433] FS: 0000000000000000(0000) GS:ffff8881f7c3e000(0000) knlGS:0000000000000000 [ 150.223192] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 150.223728] CR2: 0000000000000000 CR3: 000000010577d004 CR4: 0000000000372ef0 [ 150.224373] note: kworker/u4:5[78] exited with irqs disabled Signed-off-by: James Guan --- net/wireless/sme.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/net/wireless/sme.c b/net/wireless/sme.c index 3a028ff287fb..6014d71d2845 100644 --- a/net/wireless/sme.c +++ b/net/wireless/sme.c @@ -863,7 +863,8 @@ void __cfg80211_connect_result(struct net_device *dev, wdev->links[link].client.current_bss = bss_from_pub(cr->links[link].bss); wdev->connected = true; - ether_addr_copy(wdev->u.client.connected_addr, connected_addr); + if (connected_addr) + ether_addr_copy(wdev->u.client.connected_addr, connected_addr); if (cr->valid_links) { for_each_valid_link(cr, link) memcpy(wdev->links[link].addr, cr->links[link].addr, -- 2.25.1