public inbox for netdev@vger.kernel.org
 help / color / mirror / Atom feed
From: Arjan van de Ven <arjan@linux.intel.com>
To: linux-wireless@vger.kernel.org
Cc: syzbot+ca7a2759caaa6cd4e3db@syzkaller.appspotmail.com,
	johannes@sipsolutions.net, linux-kernel@vger.kernel.org,
	netdev@vger.kernel.org, syzkaller-bugs@googlegroups.com
Subject: Re: [syzbot] [wireless?] divide error in mac80211_hwsim_link_info_changed (3)
Date: Mon, 27 Apr 2026 13:29:54 -0700	[thread overview]
Message-ID: <20260427203005.506192-1-arjan@linux.intel.com> (raw)
In-Reply-To: <69efb8dd.050a0220.18b4f.0006.GAE@google.com>

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.

      reply	other threads:[~2026-04-27 20:28 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260427203005.506192-1-arjan@linux.intel.com \
    --to=arjan@linux.intel.com \
    --cc=johannes@sipsolutions.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-wireless@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=syzbot+ca7a2759caaa6cd4e3db@syzkaller.appspotmail.com \
    --cc=syzkaller-bugs@googlegroups.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox