Message ID | 20240929123640.558525-1-idosch@nvidia.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 555f45d24ba7cd5527716553031641cdebbe76c7 |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net] bridge: mcast: Fail MDB get request on empty entry | expand |
On 9/29/24 15:36, Ido Schimmel wrote: > When user space deletes a port from an MDB entry, the port is removed > synchronously. If this was the last port in the entry and the entry is > not joined by the host itself, then the entry is scheduled for deletion > via a timer. > > The above means that it is possible for the MDB get netlink request to > retrieve an empty entry which is scheduled for deletion. This is > problematic as after deleting the last port in an entry, user space > cannot rely on a non-zero return code from the MDB get request as an > indication that the port was successfully removed. > > Fix by returning an error when the entry's port list is empty and the > entry is not joined by the host. > > Fixes: 68b380a395a7 ("bridge: mcast: Add MDB get support") > Reported-by: Jamie Bainbridge <jamie.bainbridge@gmail.com> > Closes: https://lore.kernel.org/netdev/c92569919307749f879b9482b0f3e125b7d9d2e3.1726480066.git.jamie.bainbridge@gmail.com/ > Tested-by: Jamie Bainbridge <jamie.bainbridge@gmail.com> > Signed-off-by: Ido Schimmel <idosch@nvidia.com> > --- > net/bridge/br_mdb.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c > index bc37e47ad829..1a52a0bca086 100644 > --- a/net/bridge/br_mdb.c > +++ b/net/bridge/br_mdb.c > @@ -1674,7 +1674,7 @@ int br_mdb_get(struct net_device *dev, struct nlattr *tb[], u32 portid, u32 seq, > spin_lock_bh(&br->multicast_lock); > > mp = br_mdb_ip_get(br, &group); > - if (!mp) { > + if (!mp || (!mp->ports && !mp->host_joined)) { > NL_SET_ERR_MSG_MOD(extack, "MDB entry not found"); > err = -ENOENT; > goto unlock; Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
Hello: This patch was applied to netdev/net.git (main) by Jakub Kicinski <kuba@kernel.org>: On Sun, 29 Sep 2024 15:36:40 +0300 you wrote: > When user space deletes a port from an MDB entry, the port is removed > synchronously. If this was the last port in the entry and the entry is > not joined by the host itself, then the entry is scheduled for deletion > via a timer. > > The above means that it is possible for the MDB get netlink request to > retrieve an empty entry which is scheduled for deletion. This is > problematic as after deleting the last port in an entry, user space > cannot rely on a non-zero return code from the MDB get request as an > indication that the port was successfully removed. > > [...] Here is the summary with links: - [net] bridge: mcast: Fail MDB get request on empty entry https://git.kernel.org/netdev/net/c/555f45d24ba7 You are awesome, thank you!
diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c index bc37e47ad829..1a52a0bca086 100644 --- a/net/bridge/br_mdb.c +++ b/net/bridge/br_mdb.c @@ -1674,7 +1674,7 @@ int br_mdb_get(struct net_device *dev, struct nlattr *tb[], u32 portid, u32 seq, spin_lock_bh(&br->multicast_lock); mp = br_mdb_ip_get(br, &group); - if (!mp) { + if (!mp || (!mp->ports && !mp->host_joined)) { NL_SET_ERR_MSG_MOD(extack, "MDB entry not found"); err = -ENOENT; goto unlock;