Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1c2d670f authored by Patrick McHardy's avatar Patrick McHardy Committed by David S. Miller
Browse files

[RTNETLINK]: Hold rtnl_mutex during netlink dump callbacks



Hold rtnl_mutex during the entire netlink dump operation. This allows
to simplify locking in the dump callbacks, since they can now rely on
that no concurrent changes happen.

Signed-off-by: default avatarPatrick McHardy <kaber@trash.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent af65bdfc
Loading
Loading
Loading
Loading
+6 −2
Original line number Original line Diff line number Diff line
@@ -859,6 +859,7 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
	int min_len;
	int min_len;
	int family;
	int family;
	int type;
	int type;
	int err;


	type = nlh->nlmsg_type;
	type = nlh->nlmsg_type;
	if (type > RTM_MAX)
	if (type > RTM_MAX)
@@ -887,7 +888,10 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
		if (dumpit == NULL)
		if (dumpit == NULL)
			return -EOPNOTSUPP;
			return -EOPNOTSUPP;


		return netlink_dump_start(rtnl, skb, nlh, dumpit, NULL);
		__rtnl_unlock();
		err = netlink_dump_start(rtnl, skb, nlh, dumpit, NULL);
		rtnl_lock();
		return err;
	}
	}


	memset(rta_buf, 0, (rtattr_max * sizeof(struct rtattr *)));
	memset(rta_buf, 0, (rtattr_max * sizeof(struct rtattr *)));
@@ -972,7 +976,7 @@ void __init rtnetlink_init(void)
		panic("rtnetlink_init: cannot allocate rta_buf\n");
		panic("rtnetlink_init: cannot allocate rta_buf\n");


	rtnl = netlink_kernel_create(NETLINK_ROUTE, RTNLGRP_MAX, rtnetlink_rcv,
	rtnl = netlink_kernel_create(NETLINK_ROUTE, RTNLGRP_MAX, rtnetlink_rcv,
				     NULL, THIS_MODULE);
				     &rtnl_mutex, THIS_MODULE);
	if (rtnl == NULL)
	if (rtnl == NULL)
		panic("rtnetlink_init: cannot initialize rtnetlink\n");
		panic("rtnetlink_init: cannot initialize rtnetlink\n");
	netlink_set_nonroot(NETLINK_ROUTE, NL_NONROOT_RECV);
	netlink_set_nonroot(NETLINK_ROUTE, NL_NONROOT_RECV);