From d1a2ea58a2231b046a92dbf4745bf0214f9ea058 Mon Sep 17 00:00:00 2001 From: Dmitry Tarnyagin Date: Thu, 4 Aug 2011 14:53:06 +0200 Subject: cw1200: Fix for a crash in cw1200_join_work. [ 129.340148] Unable to handle kernel NULL pointer dereference at virtual address 00000018 [ 129.348266] pgd = c0004000 [ 129.350982] [00000018] *pgd=00000000 [ 129.354553] Internal error: Oops: 17 [#1] PREEMPT SMP [ 129.359619] last sysfs file: /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state [ 129.367431] Modules linked in: cw1200_wlan cw1200_core [ 129.372589] CPU: 1 Not tainted (2.6.35.7+ #111) [ 129.377502] PC is at cw1200_join_work+0x148/0x3c8 [cw1200_core] [ 129.383422] LR is at mutex_lock+0x18/0x4c Change-Id: I62b013780fa66592d49938c6d7d86229450105a1 Signed-off-by: Dmitry Tarnyagin Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/28283 Reviewed-by: Bartosz MARKOWSKI Tested-by: Bartosz MARKOWSKI Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/33497 Reviewed-by: Philippe LANGLAIS --- drivers/staging/cw1200/sta.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/drivers/staging/cw1200/sta.c b/drivers/staging/cw1200/sta.c index e69bd729f07..86a05dcaca2 100644 --- a/drivers/staging/cw1200/sta.c +++ b/drivers/staging/cw1200/sta.c @@ -968,17 +968,22 @@ void cw1200_join_work(struct work_struct *work) mutex_lock(&priv->conf_mutex); { struct wsm_join join = { - .mode = (bss->capability & WLAN_CAPABILITY_IBSS) ? - WSM_JOIN_MODE_IBSS : WSM_JOIN_MODE_BSS, + .mode = WSM_JOIN_MODE_BSS, .preambleType = WSM_JOIN_PREAMBLE_SHORT, .probeForJoin = 1, /* dtimPeriod will be updated after association */ .dtimPeriod = 1, - .beaconInterval = bss->beacon_interval, + .beaconInterval = 100, /* basicRateSet will be updated after association */ .basicRateSet = 7, }; + if (bss) { + join.mode = (bss->capability & WLAN_CAPABILITY_IBSS) ? + WSM_JOIN_MODE_IBSS : WSM_JOIN_MODE_BSS; + join.beaconInterval = bss->beacon_interval; + } + if (tim && tim->dtim_period > 1) { join.dtimPeriod = tim->dtim_period; priv->join_dtim_period = tim->dtim_period; @@ -1036,7 +1041,8 @@ void cw1200_join_work(struct work_struct *work) cw1200_update_filtering(priv); } mutex_unlock(&priv->conf_mutex); - cfg80211_put_bss(bss); + if (bss) + cfg80211_put_bss(bss); } void cw1200_join_timeout(struct work_struct *work) -- cgit v1.2.3