bridge: mcast: Add a centralized error path
authorIdo Schimmel <idosch@nvidia.com>
Sat, 10 Dec 2022 14:56:23 +0000 (16:56 +0200)
committerJakub Kicinski <kuba@kernel.org>
Mon, 12 Dec 2022 23:33:37 +0000 (15:33 -0800)
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: Ido Schimmel <idosch@nvidia.com>
Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/bridge/br_mdb.c

index fcdd464..9578065 100644 (file)
@@ -1053,28 +1053,29 @@ static int br_mdb_add(struct sk_buff *skb, struct nlmsghdr *nlh,
        if (err)
                return err;
 
+       err = -EINVAL;
        /* host join errors which can happen before creating the group */
        if (!cfg.p && !br_group_is_l2(&cfg.group)) {
                /* don't allow any flags for host-joined IP groups */
                if (cfg.entry->state) {
                        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)) {
                        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) {
                NL_SET_ERR_MSG_MOD(extack, "Only permanent L2 entries allowed");
-               return -EINVAL;
+               goto out;
        }
 
        if (cfg.p) {
                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");
-                       return -EINVAL;
+                       goto out;
                }
                vg = nbp_vlan_group(cfg.p);
        } else {
@@ -1096,6 +1097,7 @@ static int br_mdb_add(struct sk_buff *skb, struct nlmsghdr *nlh,
                err = __br_mdb_add(&cfg, extack);
        }
 
+out:
        return err;
 }