@@ -980,20 +980,17 @@ static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg,
980
980
981
981
eth_broadcast_addr (params_le -> bssid );
982
982
params_le -> bss_type = DOT11_BSSTYPE_ANY ;
983
- params_le -> scan_type = 0 ;
983
+ params_le -> scan_type = BRCMF_SCANTYPE_ACTIVE ;
984
984
params_le -> channel_num = 0 ;
985
985
params_le -> nprobes = cpu_to_le32 (-1 );
986
986
params_le -> active_time = cpu_to_le32 (-1 );
987
987
params_le -> passive_time = cpu_to_le32 (-1 );
988
988
params_le -> home_time = cpu_to_le32 (-1 );
989
989
memset (& params_le -> ssid_le , 0 , sizeof (params_le -> ssid_le ));
990
990
991
- /* if request is null exit so it will be all channel broadcast scan */
992
- if (!request )
993
- return ;
994
-
995
991
n_ssids = request -> n_ssids ;
996
992
n_channels = request -> n_channels ;
993
+
997
994
/* Copy channel array if applicable */
998
995
brcmf_dbg (SCAN , "### List of channelspecs to scan ### %d\n" ,
999
996
n_channels );
@@ -1030,16 +1027,8 @@ static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg,
1030
1027
ptr += sizeof (ssid_le );
1031
1028
}
1032
1029
} else {
1033
- brcmf_dbg (SCAN , "Broadcast scan %p\n" , request -> ssids );
1034
- if ((request -> ssids ) && request -> ssids -> ssid_len ) {
1035
- brcmf_dbg (SCAN , "SSID %s len=%d\n" ,
1036
- params_le -> ssid_le .SSID ,
1037
- request -> ssids -> ssid_len );
1038
- params_le -> ssid_le .SSID_len =
1039
- cpu_to_le32 (request -> ssids -> ssid_len );
1040
- memcpy (& params_le -> ssid_le .SSID , request -> ssids -> ssid ,
1041
- request -> ssids -> ssid_len );
1042
- }
1030
+ brcmf_dbg (SCAN , "Performing passive scan\n" );
1031
+ params_le -> scan_type = BRCMF_SCANTYPE_PASSIVE ;
1043
1032
}
1044
1033
/* Adding mask to channel numbers */
1045
1034
params_le -> channel_num =
@@ -3162,6 +3151,7 @@ brcmf_cfg80211_escan_handler(struct brcmf_if *ifp,
3162
3151
struct brcmf_cfg80211_info * cfg = ifp -> drvr -> config ;
3163
3152
s32 status ;
3164
3153
struct brcmf_escan_result_le * escan_result_le ;
3154
+ u32 escan_buflen ;
3165
3155
struct brcmf_bss_info_le * bss_info_le ;
3166
3156
struct brcmf_bss_info_le * bss = NULL ;
3167
3157
u32 bi_length ;
@@ -3181,11 +3171,23 @@ brcmf_cfg80211_escan_handler(struct brcmf_if *ifp,
3181
3171
3182
3172
if (status == BRCMF_E_STATUS_PARTIAL ) {
3183
3173
brcmf_dbg (SCAN , "ESCAN Partial result\n" );
3174
+ if (e -> datalen < sizeof (* escan_result_le )) {
3175
+ brcmf_err ("invalid event data length\n" );
3176
+ goto exit ;
3177
+ }
3184
3178
escan_result_le = (struct brcmf_escan_result_le * ) data ;
3185
3179
if (!escan_result_le ) {
3186
3180
brcmf_err ("Invalid escan result (NULL pointer)\n" );
3187
3181
goto exit ;
3188
3182
}
3183
+ escan_buflen = le32_to_cpu (escan_result_le -> buflen );
3184
+ if (escan_buflen > BRCMF_ESCAN_BUF_SIZE ||
3185
+ escan_buflen > e -> datalen ||
3186
+ escan_buflen < sizeof (* escan_result_le )) {
3187
+ brcmf_err ("Invalid escan buffer length: %d\n" ,
3188
+ escan_buflen );
3189
+ goto exit ;
3190
+ }
3189
3191
if (le16_to_cpu (escan_result_le -> bss_count ) != 1 ) {
3190
3192
brcmf_err ("Invalid bss_count %d: ignoring\n" ,
3191
3193
escan_result_le -> bss_count );
@@ -3202,9 +3204,8 @@ brcmf_cfg80211_escan_handler(struct brcmf_if *ifp,
3202
3204
}
3203
3205
3204
3206
bi_length = le32_to_cpu (bss_info_le -> length );
3205
- if (bi_length != (le32_to_cpu (escan_result_le -> buflen ) -
3206
- WL_ESCAN_RESULTS_FIXED_SIZE )) {
3207
- brcmf_err ("Invalid bss_info length %d: ignoring\n" ,
3207
+ if (bi_length != escan_buflen - WL_ESCAN_RESULTS_FIXED_SIZE ) {
3208
+ brcmf_err ("Ignoring invalid bss_info length: %d\n" ,
3208
3209
bi_length );
3209
3210
goto exit ;
3210
3211
}
0 commit comments