mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 06:44:00 -04:00
Merge tag 'batadv-net-pullrequest-20260408' of https://git.open-mesh.org/linux-merge
Simon Wunderlich says: ==================== Here are two batman-adv bugfixes: - reject oversized global TT response buffers, by Ruide Cao - hold claim backbone gateways by reference, by Haoze Xie * tag 'batadv-net-pullrequest-20260408' of https://git.open-mesh.org/linux-merge: batman-adv: hold claim backbone gateways by reference batman-adv: reject oversized global TT response buffers ==================== Link: https://patch.msgid.link/20260408110255.976389-1-sw@simonwunderlich.de Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -2130,6 +2130,7 @@ batadv_bla_claim_dump_entry(struct sk_buff *msg, u32 portid,
|
||||
struct batadv_bla_claim *claim)
|
||||
{
|
||||
const u8 *primary_addr = primary_if->net_dev->dev_addr;
|
||||
struct batadv_bla_backbone_gw *backbone_gw;
|
||||
u16 backbone_crc;
|
||||
bool is_own;
|
||||
void *hdr;
|
||||
@@ -2145,32 +2146,35 @@ batadv_bla_claim_dump_entry(struct sk_buff *msg, u32 portid,
|
||||
|
||||
genl_dump_check_consistent(cb, hdr);
|
||||
|
||||
is_own = batadv_compare_eth(claim->backbone_gw->orig,
|
||||
primary_addr);
|
||||
backbone_gw = batadv_bla_claim_get_backbone_gw(claim);
|
||||
|
||||
spin_lock_bh(&claim->backbone_gw->crc_lock);
|
||||
backbone_crc = claim->backbone_gw->crc;
|
||||
spin_unlock_bh(&claim->backbone_gw->crc_lock);
|
||||
is_own = batadv_compare_eth(backbone_gw->orig, primary_addr);
|
||||
|
||||
spin_lock_bh(&backbone_gw->crc_lock);
|
||||
backbone_crc = backbone_gw->crc;
|
||||
spin_unlock_bh(&backbone_gw->crc_lock);
|
||||
|
||||
if (is_own)
|
||||
if (nla_put_flag(msg, BATADV_ATTR_BLA_OWN)) {
|
||||
genlmsg_cancel(msg, hdr);
|
||||
goto out;
|
||||
goto put_backbone_gw;
|
||||
}
|
||||
|
||||
if (nla_put(msg, BATADV_ATTR_BLA_ADDRESS, ETH_ALEN, claim->addr) ||
|
||||
nla_put_u16(msg, BATADV_ATTR_BLA_VID, claim->vid) ||
|
||||
nla_put(msg, BATADV_ATTR_BLA_BACKBONE, ETH_ALEN,
|
||||
claim->backbone_gw->orig) ||
|
||||
backbone_gw->orig) ||
|
||||
nla_put_u16(msg, BATADV_ATTR_BLA_CRC,
|
||||
backbone_crc)) {
|
||||
genlmsg_cancel(msg, hdr);
|
||||
goto out;
|
||||
goto put_backbone_gw;
|
||||
}
|
||||
|
||||
genlmsg_end(msg, hdr);
|
||||
ret = 0;
|
||||
|
||||
put_backbone_gw:
|
||||
batadv_backbone_gw_put(backbone_gw);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
@@ -2448,6 +2452,7 @@ out:
|
||||
bool batadv_bla_check_claim(struct batadv_priv *bat_priv,
|
||||
u8 *addr, unsigned short vid)
|
||||
{
|
||||
struct batadv_bla_backbone_gw *backbone_gw;
|
||||
struct batadv_bla_claim search_claim;
|
||||
struct batadv_bla_claim *claim = NULL;
|
||||
struct batadv_hard_iface *primary_if = NULL;
|
||||
@@ -2470,9 +2475,13 @@ bool batadv_bla_check_claim(struct batadv_priv *bat_priv,
|
||||
* return false.
|
||||
*/
|
||||
if (claim) {
|
||||
if (!batadv_compare_eth(claim->backbone_gw->orig,
|
||||
backbone_gw = batadv_bla_claim_get_backbone_gw(claim);
|
||||
|
||||
if (!batadv_compare_eth(backbone_gw->orig,
|
||||
primary_if->net_dev->dev_addr))
|
||||
ret = false;
|
||||
|
||||
batadv_backbone_gw_put(backbone_gw);
|
||||
batadv_claim_put(claim);
|
||||
}
|
||||
|
||||
|
||||
@@ -798,8 +798,8 @@ batadv_tt_prepare_tvlv_global_data(struct batadv_orig_node *orig_node,
|
||||
{
|
||||
u16 num_vlan = 0;
|
||||
u16 num_entries = 0;
|
||||
u16 change_offset;
|
||||
u16 tvlv_len;
|
||||
u16 tvlv_len = 0;
|
||||
unsigned int change_offset;
|
||||
struct batadv_tvlv_tt_vlan_data *tt_vlan;
|
||||
struct batadv_orig_node_vlan *vlan;
|
||||
u8 *tt_change_ptr;
|
||||
@@ -816,6 +816,11 @@ batadv_tt_prepare_tvlv_global_data(struct batadv_orig_node *orig_node,
|
||||
if (*tt_len < 0)
|
||||
*tt_len = batadv_tt_len(num_entries);
|
||||
|
||||
if (change_offset > U16_MAX || *tt_len > U16_MAX - change_offset) {
|
||||
*tt_len = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
tvlv_len = *tt_len;
|
||||
tvlv_len += change_offset;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user