@@ -3162,6 +3162,7 @@ brcmf_cfg80211_escan_handler(struct brcmf_if *ifp,
3162
3162
struct brcmf_cfg80211_info * cfg = ifp -> drvr -> config ;
3163
3163
s32 status ;
3164
3164
struct brcmf_escan_result_le * escan_result_le ;
3165
+ u32 escan_buflen ;
3165
3166
struct brcmf_bss_info_le * bss_info_le ;
3166
3167
struct brcmf_bss_info_le * bss = NULL ;
3167
3168
u32 bi_length ;
@@ -3181,11 +3182,23 @@ brcmf_cfg80211_escan_handler(struct brcmf_if *ifp,
3181
3182
3182
3183
if (status == BRCMF_E_STATUS_PARTIAL ) {
3183
3184
brcmf_dbg (SCAN , "ESCAN Partial result\n" );
3185
+ if (e -> datalen < sizeof (* escan_result_le )) {
3186
+ brcmf_err ("invalid event data length\n" );
3187
+ goto exit ;
3188
+ }
3184
3189
escan_result_le = (struct brcmf_escan_result_le * ) data ;
3185
3190
if (!escan_result_le ) {
3186
3191
brcmf_err ("Invalid escan result (NULL pointer)\n" );
3187
3192
goto exit ;
3188
3193
}
3194
+ escan_buflen = le32_to_cpu (escan_result_le -> buflen );
3195
+ if (escan_buflen > BRCMF_ESCAN_BUF_SIZE ||
3196
+ escan_buflen > e -> datalen ||
3197
+ escan_buflen < sizeof (* escan_result_le )) {
3198
+ brcmf_err ("Invalid escan buffer length: %d\n" ,
3199
+ escan_buflen );
3200
+ goto exit ;
3201
+ }
3189
3202
if (le16_to_cpu (escan_result_le -> bss_count ) != 1 ) {
3190
3203
brcmf_err ("Invalid bss_count %d: ignoring\n" ,
3191
3204
escan_result_le -> bss_count );
@@ -3202,9 +3215,8 @@ brcmf_cfg80211_escan_handler(struct brcmf_if *ifp,
3202
3215
}
3203
3216
3204
3217
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" ,
3218
+ if (bi_length != escan_buflen - WL_ESCAN_RESULTS_FIXED_SIZE ) {
3219
+ brcmf_err ("Ignoring invalid bss_info length: %d\n" ,
3208
3220
bi_length );
3209
3221
goto exit ;
3210
3222
}
0 commit comments