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 <ido...@nvidia.com>
---
 net/bridge/br_mdb.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c
index fcdd464cf997..95780652cdbf 100644
--- a/net/bridge/br_mdb.c
+++ b/net/bridge/br_mdb.c
@@ -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;
 }
 
-- 
2.37.3

Reply via email to