nl80211: use for_each_element() in validate_ie_attr()
authorJohannes Berg <johannes.berg@intel.com>
Thu, 7 Feb 2019 22:39:19 +0000 (23:39 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 8 Feb 2019 12:51:50 +0000 (13:51 +0100)
This makes for much simpler code, simply walk through all
the elements and check that the last one found ends with
the end of the data. This works because if any element is
malformed the walk is aborted, we end up with a mismatch.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/wireless/nl80211.c

index a3cc039b9f5556c740ad24bf7a4cf304956feed2..5d85f6032f84068d5c4c1485ff442c50ff96a7b6 100644 (file)
@@ -203,29 +203,17 @@ cfg80211_get_dev_from_info(struct net *netns, struct genl_info *info)
 static int validate_ie_attr(const struct nlattr *attr,
                            struct netlink_ext_ack *extack)
 {
-       const u8 *pos;
-       int len;
+       const u8 *data = nla_data(attr);
+       unsigned int len = nla_len(attr);
+       struct element *elem;
 
-       pos = nla_data(attr);
-       len = nla_len(attr);
-
-       while (len) {
-               u8 elemlen;
-
-               if (len < 2)
-                       goto error;
-               len -= 2;
-
-               elemlen = pos[1];
-               if (elemlen > len)
-                       goto error;
-
-               len -= elemlen;
-               pos += 2 + elemlen;
+       for_each_element(elem, data, len) {
+               /* nothing */
        }
 
-       return 0;
-error:
+       if (for_each_element_completed(elem, data, len))
+               return 0;
+
        NL_SET_ERR_MSG_ATTR(extack, attr, "malformed information elements");
        return -EINVAL;
 }