linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* re: iwlwifi: split the drivers for agn and legacy devices 3945/4965
@ 2015-02-26  8:56 Dan Carpenter
  0 siblings, 0 replies; only message in thread
From: Dan Carpenter @ 2015-02-26  8:56 UTC (permalink / raw)
  To: wey-yi.w.guy; +Cc: linux-wireless

Hello Wey-Yi Guy,

The patch be663ab67077: "iwlwifi: split the drivers for agn and
legacy devices 3945/4965" from Feb 21, 2011, leads to the following
static checker warning:

	drivers/net/wireless/iwlegacy/4965-mac.c:6390 il4965_init_drv()
	error: potential NULL dereference 'il->ieee_rates'.

Also:

	drivers/net/wireless/iwlegacy/3945-mac.c:3541 il3945_init_drv()
	error: potential NULL dereference 'il->ieee_rates'.

The il_init_geos() function is the only place where we set
"->ieee_rates" to non-NULL.  There are two callers and they both rely
on il_init_geos() to set it to non-NULL otherwise they crash.  However,
there is a return in il_init_geos() which does not set ->ieee_rates so
if we ever hit that path then the kernel will Oops.  This makes the
static checkers complain.

drivers/net/wireless/iwlegacy/common.c
  3431  int
  3432  il_init_geos(struct il_priv *il)
  3433  {
  3434          struct il_channel_info *ch;
  3435          struct ieee80211_supported_band *sband;
  3436          struct ieee80211_channel *channels;
  3437          struct ieee80211_channel *geo_ch;
  3438          struct ieee80211_rate *rates;
  3439          int i = 0;
  3440          s8 max_tx_power = 0;
  3441  
  3442          if (il->bands[IEEE80211_BAND_2GHZ].n_bitrates ||
  3443              il->bands[IEEE80211_BAND_5GHZ].n_bitrates) {
  3444                  D_INFO("Geography modes already initialized.\n");
  3445                  set_bit(S_GEO_CONFIGURED, &il->status);
  3446                  return 0;
                        ^^^^^^^^
We have not set ->ieee_rates here.  If we ever hit this return then the
kernel will Oops.

  3447          }
  3448  

Here is one caller, the other is the same.

drivers/net/wireless/iwlegacy/4965-mac.c
  6362          il->ieee_channels = NULL;
  6363          il->ieee_rates = NULL;
                ^^^^^^^^^^^^^^^^^^^^^
We set il->ieee_rates to NULL.

  6364          il->band = IEEE80211_BAND_2GHZ;
  6365  
  6366          il->iw_mode = NL80211_IFTYPE_STATION;
  6367          il->current_ht_config.smps = IEEE80211_SMPS_STATIC;
  6368          il->missed_beacon_threshold = IL_MISSED_BEACON_THRESHOLD_DEF;
  6369  
  6370          /* initialize force reset */
  6371          il->force_reset.reset_duration = IL_DELAY_NEXT_FORCE_FW_RELOAD;
  6372  
  6373          /* Choose which receivers/antennas to use */
  6374          if (il->ops->set_rxon_chain)
  6375                  il->ops->set_rxon_chain(il);
  6376  
  6377          il_init_scan_params(il);
  6378  
  6379          ret = il_init_channel_map(il);
  6380          if (ret) {
  6381                  IL_ERR("initializing regulatory failed: %d\n", ret);
  6382                  goto err;
  6383          }
  6384  
  6385          ret = il_init_geos(il);
                      ^^^^^^^^^^^^^^^^
Assume we hit the problematic return.

  6386          if (ret) {
  6387                  IL_ERR("initializing geos failed: %d\n", ret);
  6388                  goto err_free_channel_map;
  6389          }
  6390          il4965_init_hw_rates(il, il->ieee_rates);
                                         ^^^^^^^^^^^^^^
This will lead to a NULL dereference inside the il4965_init_hw_rates()
function.

  6391  
  6392          return 0;

regards,
dan carpenter

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2015-02-26  8:56 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-02-26  8:56 iwlwifi: split the drivers for agn and legacy devices 3945/4965 Dan Carpenter

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).