Commit 160dd931 authored by Ido Schimmel's avatar Ido Schimmel Committed by Jakub Kicinski

bridge: mcast: Add a centralized error path

Subsequent patches will add memory allocations in br_mdb_config_init()
as the MDB configuration structure will include a linked list of source
entries. This memory will need to be freed regardless if br_mdb_add()
succeeded or failed.

As a preparation for this change, add a centralized error path where the
memory will be freed.

Note that br_mdb_del() already has one error path and therefore does not
require any changes.
Signed-off-by: default avatarIdo Schimmel <idosch@nvidia.com>
Acked-by: default avatarNikolay Aleksandrov <razor@blackwall.org>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 1870a2d3
...@@ -1053,28 +1053,29 @@ static int br_mdb_add(struct sk_buff *skb, struct nlmsghdr *nlh, ...@@ -1053,28 +1053,29 @@ static int br_mdb_add(struct sk_buff *skb, struct nlmsghdr *nlh,
if (err) if (err)
return err; return err;
err = -EINVAL;
/* host join errors which can happen before creating the group */ /* host join errors which can happen before creating the group */
if (!cfg.p && !br_group_is_l2(&cfg.group)) { if (!cfg.p && !br_group_is_l2(&cfg.group)) {
/* don't allow any flags for host-joined IP groups */ /* don't allow any flags for host-joined IP groups */
if (cfg.entry->state) { if (cfg.entry->state) {
NL_SET_ERR_MSG_MOD(extack, "Flags are not allowed for host groups"); NL_SET_ERR_MSG_MOD(extack, "Flags are not allowed for host groups");
return -EINVAL; goto out;
} }
if (!br_multicast_is_star_g(&cfg.group)) { if (!br_multicast_is_star_g(&cfg.group)) {
NL_SET_ERR_MSG_MOD(extack, "Groups with sources cannot be manually host joined"); NL_SET_ERR_MSG_MOD(extack, "Groups with sources cannot be manually host joined");
return -EINVAL; goto out;
} }
} }
if (br_group_is_l2(&cfg.group) && cfg.entry->state != MDB_PERMANENT) { if (br_group_is_l2(&cfg.group) && cfg.entry->state != MDB_PERMANENT) {
NL_SET_ERR_MSG_MOD(extack, "Only permanent L2 entries allowed"); NL_SET_ERR_MSG_MOD(extack, "Only permanent L2 entries allowed");
return -EINVAL; goto out;
} }
if (cfg.p) { if (cfg.p) {
if (cfg.p->state == BR_STATE_DISABLED && cfg.entry->state != MDB_PERMANENT) { if (cfg.p->state == BR_STATE_DISABLED && cfg.entry->state != MDB_PERMANENT) {
NL_SET_ERR_MSG_MOD(extack, "Port is in disabled state and entry is not permanent"); NL_SET_ERR_MSG_MOD(extack, "Port is in disabled state and entry is not permanent");
return -EINVAL; goto out;
} }
vg = nbp_vlan_group(cfg.p); vg = nbp_vlan_group(cfg.p);
} else { } else {
...@@ -1096,6 +1097,7 @@ static int br_mdb_add(struct sk_buff *skb, struct nlmsghdr *nlh, ...@@ -1096,6 +1097,7 @@ static int br_mdb_add(struct sk_buff *skb, struct nlmsghdr *nlh,
err = __br_mdb_add(&cfg, extack); err = __br_mdb_add(&cfg, extack);
} }
out:
return err; return err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment