> - if (tlv_full_len > payload_len) {
> - pr_warn("VIF%u.%u: malformed TLV 0x%.2X; LEN: %u\n",
> - mac->macid, vif->vifid, tlv_type,
> - tlv_value_len);
> + if (tlv_full_len > payload_len)
> return -EINVAL;
> - }
Why drop this sanity check ?
> if (tlv_type == QTN_TLV_ID_IE_SET) {
> - sinfo.assoc_req_ies = tlv->val;
> - sinfo.assoc_req_ies_len = tlv_value_len;
> + const struct qlink_tlv_ie_set *ie_set;
> + unsigned int ie_len;
> +
> + if (payload_len < sizeof(*ie_set))
> + return -EINVAL;
> +
> + ie_set = (const struct qlink_tlv_ie_set *)tlv;
> + ie_len = tlv_value_len -
> + (sizeof(*ie_set) - sizeof(ie_set->hdr));
> +
> + if (ie_set->type == QLINK_IE_SET_ASSOC_REQ && ie_len) {
> + sinfo.assoc_req_ies = ie_set->ie_data;
> + sinfo.assoc_req_ies_len = ie_len;
> + }
> }
Does it make sense to keep QTN_TLV_ID_IE_SET here at all ?
Maybe replace it completely by qlink_tlv_ie_set with
QLINK_IE_SET_ASSOC_REQ type ? Also see the comment below
for the similar snippet in qtnf_event_handle_scan_results.
...
> - if (tlv_full_len > payload_len) {
> - pr_warn("VIF%u.%u: malformed TLV 0x%.2X; LEN: %u\n",
> - vif->mac->macid, vif->vifid, tlv_type,
> - tlv_value_len);
> + if (tlv_full_len > payload_len)
> return -EINVAL;
> - }
ditto
...
> if (tlv_type == QTN_TLV_ID_IE_SET) {
> - ies = tlv->val;
> - ies_len = tlv_value_len;
> + const struct qlink_tlv_ie_set *ie_set;
> + unsigned int ie_len;
> +
> + if (payload_len < sizeof(*ie_set))
> + return -EINVAL;
> +
> + ie_set = (const struct qlink_tlv_ie_set *)tlv;
> + ie_len = tlv_value_len -
> + (sizeof(*ie_set) - sizeof(ie_set->hdr));
> +
> + if (ie_len) {
> + ies = ie_set->ie_data;
> + ies_len = ie_len;
> + }
> }
> }
Two points here. First, it looks like there is a problem here inherited
from the existing implementation. We go through payload, but in fact we
pass to cfg80211_inform_bss only the last QTN_TLV_ID_IE_SET element.
Second, it looks like QTN_TLV_ID_IE_SET here should be treated in
the same way as in qtnf_event_handle_sta_assoc, to avoid confusion.
In other words, either we use only QTN_TLV_ID_IE_SET in both cases,
or switch to specific qlink_tlv_ie_set elements.
Thoughts ? Comments ?
Regards,
Sergey