@@ -895,8 +895,7 @@ u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
895895 struct ieee802_11_elems * elems ,
896896 u64 filter , u32 crc )
897897{
898- size_t left = len ;
899- const u8 * pos = start ;
898+ struct element * elem ;
900899 bool calc_crc = filter != 0 ;
901900 DECLARE_BITMAP (seen_elems , 256 );
902901 const u8 * ie ;
@@ -906,18 +905,11 @@ u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
906905 elems -> ie_start = start ;
907906 elems -> total_len = len ;
908907
909- while (left >= 2 ) {
910- u8 id , elen ;
908+ for_each_element (elem , start , len ) {
911909 bool elem_parse_failed ;
912-
913- id = * pos ++ ;
914- elen = * pos ++ ;
915- left -= 2 ;
916-
917- if (elen > left ) {
918- elems -> parse_error = true;
919- break ;
920- }
910+ u8 id = elem -> id ;
911+ u8 elen = elem -> datalen ;
912+ const u8 * pos = elem -> data ;
921913
922914 switch (id ) {
923915 case WLAN_EID_SSID :
@@ -960,8 +952,6 @@ u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
960952 */
961953 if (test_bit (id , seen_elems )) {
962954 elems -> parse_error = true;
963- left -= elen ;
964- pos += elen ;
965955 continue ;
966956 }
967957 break ;
@@ -1244,12 +1234,9 @@ u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
12441234 elems -> parse_error = true;
12451235 else
12461236 __set_bit (id , seen_elems );
1247-
1248- left -= elen ;
1249- pos += elen ;
12501237 }
12511238
1252- if (left != 0 )
1239+ if (! for_each_element_completed ( elem , start , len ) )
12531240 elems -> parse_error = true;
12541241
12551242 return crc ;
0 commit comments