* [syzbot] [wireless?] divide error in mac80211_hwsim_link_info_changed (3)
@ 2026-04-27 19:28 syzbot
2026-04-27 20:29 ` Arjan van de Ven
0 siblings, 1 reply; 2+ messages in thread
From: syzbot @ 2026-04-27 19:28 UTC (permalink / raw)
To: johannes, linux-kernel, linux-wireless, netdev, syzkaller-bugs
Hello,
syzbot found the following issue on:
HEAD commit: 254f49634ee1 Linux 7.1-rc1
git tree: upstream
console output: https://syzkaller.appspot.com/x/log.txt?x=13b32348580000
kernel config: https://syzkaller.appspot.com/x/.config?x=4caf64b1ee83dac0
dashboard link: https://syzkaller.appspot.com/bug?extid=ca7a2759caaa6cd4e3db
compiler: Debian clang version 21.1.8 (++20251221033036+2078da43e25a-1~exp1~20251221153213.50), Debian LLD 21.1.8
userspace arch: i386
Unfortunately, I don't have any reproducer for this issue yet.
Downloadable assets:
disk image: https://storage.googleapis.com/syzbot-assets/fd59c3aee25f/disk-254f4963.raw.xz
vmlinux: https://storage.googleapis.com/syzbot-assets/2a93e1c819bd/vmlinux-254f4963.xz
kernel image: https://storage.googleapis.com/syzbot-assets/18c05b34ca3c/bzImage-254f4963.xz
IMPORTANT: if you fix the issue, please add the following tag to the commit:
Reported-by: syzbot+ca7a2759caaa6cd4e3db@syzkaller.appspotmail.com
Oops: divide error: 0000 [#1] SMP KASAN PTI
CPU: 1 UID: 0 PID: 193 Comm: kworker/u8:6 Tainted: G L syzkaller #0 PREEMPT(full)
Tainted: [L]=SOFTLOCKUP
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 04/18/2026
Workqueue: events_unbound cfg80211_wiphy_work
RIP: 0010:mac80211_hwsim_link_info_changed+0x476/0xfc0 drivers/net/wireless/virtual/mac80211_hwsim.c:2734
Code: 3c 06 00 49 89 c6 48 8b 7c 24 20 74 0a e8 42 72 26 fb 48 8b 7c 24 20 48 8b 0f 89 ce 4c 89 e0 48 c1 e8 20 74 60 4c 89 e0 31 d2 <48> f7 f6 eb 5d e8 30 37 bb fa 4c 8b 74 24 20 49 8d 7e 10 e8 a2 e4
RSP: 0000:ffffc90002ea7860 EFLAGS: 00010246
RAX: 000650757bb12572 RBX: 0000000000000200 RCX: 0000000000000000
RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff88806fbe7b98
RBP: ffffc90002ea7958 R08: ffffffff903096f7 R09: 1ffffffff20612de
R10: dffffc0000000000 R11: fffffbfff20612df R12: 000650757bb12572
R13: ffff88806fbe7b18 R14: dffffc0000000000 R15: 1ffff920005d4f18
FS: 0000000000000000(0000) GS:ffff888125393000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00000000f540c000 CR3: 0000000064b3a000 CR4: 00000000003526f0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 000000000000000e DR6: 00000000ffff0ff0 DR7: 0000000000000400
Call Trace:
<TASK>
drv_link_info_changed+0x505/0x880 net/mac80211/driver-ops.c:-1
ieee80211_offchannel_return+0x375/0x500 net/mac80211/offchannel.c:160
__ieee80211_scan_completed+0x75a/0xb40 net/mac80211/scan.c:519
cfg80211_wiphy_work+0x2cf/0x460 net/wireless/core.c:513
process_one_work kernel/workqueue.c:3302 [inline]
process_scheduled_works+0xb5d/0x1860 kernel/workqueue.c:3385
worker_thread+0xa53/0xfc0 kernel/workqueue.c:3466
kthread+0x388/0x470 kernel/kthread.c:436
ret_from_fork+0x514/0xb70 arch/x86/kernel/process.c:158
ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:245
</TASK>
Modules linked in:
---[ end trace 0000000000000000 ]---
RIP: 0010:mac80211_hwsim_link_info_changed+0x476/0xfc0 drivers/net/wireless/virtual/mac80211_hwsim.c:2734
Code: 3c 06 00 49 89 c6 48 8b 7c 24 20 74 0a e8 42 72 26 fb 48 8b 7c 24 20 48 8b 0f 89 ce 4c 89 e0 48 c1 e8 20 74 60 4c 89 e0 31 d2 <48> f7 f6 eb 5d e8 30 37 bb fa 4c 8b 74 24 20 49 8d 7e 10 e8 a2 e4
RSP: 0000:ffffc90002ea7860 EFLAGS: 00010246
RAX: 000650757bb12572 RBX: 0000000000000200 RCX: 0000000000000000
RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff88806fbe7b98
RBP: ffffc90002ea7958 R08: ffffffff903096f7 R09: 1ffffffff20612de
R10: dffffc0000000000 R11: fffffbfff20612df R12: 000650757bb12572
R13: ffff88806fbe7b18 R14: dffffc0000000000 R15: 1ffff920005d4f18
FS: 0000000000000000(0000) GS:ffff888125393000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00000000f7487a54 CR3: 00000000608c4000 CR4: 00000000003526f0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 000000000000000e DR6: 00000000ffff0ff0 DR7: 0000000000000400
----------------
Code disassembly (best guess), 3 bytes skipped:
0: 49 89 c6 mov %rax,%r14
3: 48 8b 7c 24 20 mov 0x20(%rsp),%rdi
8: 74 0a je 0x14
a: e8 42 72 26 fb call 0xfb267251
f: 48 8b 7c 24 20 mov 0x20(%rsp),%rdi
14: 48 8b 0f mov (%rdi),%rcx
17: 89 ce mov %ecx,%esi
19: 4c 89 e0 mov %r12,%rax
1c: 48 c1 e8 20 shr $0x20,%rax
20: 74 60 je 0x82
22: 4c 89 e0 mov %r12,%rax
25: 31 d2 xor %edx,%edx
* 27: 48 f7 f6 div %rsi <-- trapping instruction
2a: eb 5d jmp 0x89
2c: e8 30 37 bb fa call 0xfabb3761
31: 4c 8b 74 24 20 mov 0x20(%rsp),%r14
36: 49 8d 7e 10 lea 0x10(%r14),%rdi
3a: e8 .byte 0xe8
3b: a2 .byte 0xa2
3c: e4 .byte 0xe4
---
This report is generated by a bot. It may contain errors.
See https://goo.gl/tpsmEJ for more information about syzbot.
syzbot engineers can be reached at syzkaller@googlegroups.com.
syzbot will keep track of this issue. See:
https://goo.gl/tpsmEJ#status for how to communicate with syzbot.
If the report is already addressed, let syzbot know by replying with:
#syz fix: exact-commit-title
If you want to overwrite report's subsystems, reply with:
#syz set subsystems: new-subsystem
(See the list of subsystem names on the web dashboard)
If the report is a duplicate of another one, reply with:
#syz dup: exact-subject-of-another-report
If you want to undo deduplication, reply with:
#syz undup
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [syzbot] [wireless?] divide error in mac80211_hwsim_link_info_changed (3)
2026-04-27 19:28 [syzbot] [wireless?] divide error in mac80211_hwsim_link_info_changed (3) syzbot
@ 2026-04-27 20:29 ` Arjan van de Ven
0 siblings, 0 replies; 2+ messages in thread
From: Arjan van de Ven @ 2026-04-27 20:29 UTC (permalink / raw)
To: linux-wireless
Cc: syzbot+ca7a2759caaa6cd4e3db, johannes, linux-kernel, netdev,
syzkaller-bugs
This email is created by automation to help kernel developers
deal with a large volume of AI generated bug reports by decoding
oopses into more actionable information.
Decoded Backtrace
1. mac80211_hwsim_link_info_changed -- crash site
(drivers/net/wireless/virtual/mac80211_hwsim.c:2734)
2701 static void mac80211_hwsim_link_info_changed(struct ieee80211_hw *hw,
2702 struct ieee80211_vif *vif,
2703 struct ieee80211_bss_conf *info,
2704 u64 changed)
2705 {
2706 struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
2707 struct mac80211_hwsim_data *data = hw->priv;
2708 unsigned int link_id = info->link_id;
2709 struct mac80211_hwsim_link_data *link_data = &data->link_data[link_id];
...
2722 if (changed & BSS_CHANGED_BEACON_ENABLED) {
2723 wiphy_dbg(hw->wiphy, " BCN EN: %d (BI=%u)\n",
2724 info->enable_beacon, info->beacon_int);
2725 vp->bcn_en = info->enable_beacon;
2726 if (data->started &&
2727 !hrtimer_active(&link_data->beacon_timer) &&
2728 info->enable_beacon) {
2729 u64 tsf, until_tbtt;
2730 u32 bcn_int;
2731 link_data->beacon_int = info->beacon_int * 1024;
2732 tsf = mac80211_hwsim_get_tsf(hw, vif);
2733 bcn_int = link_data->beacon_int;
-> 2734 until_tbtt = bcn_int - do_div(tsf, bcn_int); // <- bcn_int=0; RSI=0 -> #DE
2735
2736 hrtimer_start(&link_data->beacon_timer,
2737 ns_to_ktime(until_tbtt * NSEC_PER_USEC),
2738 HRTIMER_MODE_REL_SOFT);
2739 } else if (!info->enable_beacon) {
...
2748 link_data->beacon_int = 0;
...
2750 }
2751 }
2. drv_link_info_changed -- (net/mac80211/driver-ops.c:497)
460 void drv_link_info_changed(struct ieee80211_local *local,
461 struct ieee80211_sub_if_data *sdata,
462 struct ieee80211_bss_conf *info,
463 int link_id, u64 changed)
464 {
...
493 trace_drv_link_info_changed(local, sdata, info, changed);
494 if (local->ops->link_info_changed)
495 local->ops->link_info_changed(&local->hw, &sdata->vif,
496 info, changed);
-> 497 else if (local->ops->bss_info_changed)
498 local->ops->bss_info_changed(&local->hw, &sdata->vif,
499 info, changed);
500 trace_drv_return_void(local);
501 }
3. ieee80211_offchannel_return -- (net/mac80211/offchannel.c:160)
133 void ieee80211_offchannel_return(struct ieee80211_local *local)
134 {
135 struct ieee80211_sub_if_data *sdata;
136
137 lockdep_assert_wiphy(local->hw.wiphy);
...
142 list_for_each_entry(sdata, &local->interfaces, list) {
...
157 if (test_and_clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED,
158 &sdata->state)) {
159 sdata->vif.bss_conf.enable_beacon = true;
-> 160 ieee80211_link_info_change_notify(
161 sdata, &sdata->deflink,
162 BSS_CHANGED_BEACON_ENABLED);
163 }
164 }
4. __ieee80211_scan_completed -- (net/mac80211/scan.c:519)
516 if (!hw_scan && was_scanning) {
517 ieee80211_configure_filter(local);
518 drv_sw_scan_complete(local, scan_sdata);
-> 519 ieee80211_offchannel_return(local);
520 }
5. cfg80211_wiphy_work -- (net/wireless/core.c:513)
(workqueue dispatch point for scan completion)
Tentative Analysis
When a software scan completes, __ieee80211_scan_completed calls
ieee80211_offchannel_return, which iterates active interfaces and
re-enables beaconing for any interface that had its beacon stopped
during the scan. It sets bss_conf.enable_beacon = true and issues
a BSS_CHANGED_BEACON_ENABLED notification, but does NOT update
bss_conf.beacon_int.
This notification reaches mac80211_hwsim_link_info_changed. The
condition at lines 2726-2728 (data->started, timer not active,
enable_beacon) is satisfied, so the function enters the beacon
timer setup block at line 2731. It sets link_data->beacon_int =
info->beacon_int * 1024. When info->beacon_int is zero -- which
syzbot achieved by creating an AP interface with beacon_int=0 --
this produces link_data->beacon_int = 0 and bcn_int = 0 (line
2733). The subsequent do_div(tsf, bcn_int) with a zero divisor
triggers the x86 #DE (divide error) exception (RSI = 0, as
confirmed by the register dump).
An identical do_div(tsf, bcn_int) expression in
mac80211_hwsim_config (mac80211_hwsim.c:2635) is protected by a
guard: "if (!data->started || !link_data->beacon_int)" -- this
guard is absent from the BSS_CHANGED_BEACON_ENABLED path.
Potential Solution
Add a zero check for bcn_int immediately after it is loaded from
link_data->beacon_int (line 2733), before the do_div call. A
beacon interval of zero is invalid; when encountered, return
without starting the timer:
bcn_int = link_data->beacon_int;
if (!bcn_int)
return;
until_tbtt = bcn_int - do_div(tsf, bcn_int);
This mirrors the guard already present in mac80211_hwsim_config
for the same expression. The Fixes tag for the commit would be:
Fixes: c51f878379b1 ("mac80211_hwsim: fix beacon timing")
More information
Oops-Analysis: http://oops.fenrus.org/reports/lkml/69efb8dd.050a0220.18b4f.0006.GAE_google.com/
Assisted-by: Copilot:claude-sonnet-4.6 linux-kernel-oops-x86.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-04-27 20:28 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-27 19:28 [syzbot] [wireless?] divide error in mac80211_hwsim_link_info_changed (3) syzbot
2026-04-27 20:29 ` Arjan van de Ven
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox