aboutsummaryrefslogtreecommitdiff
path: root/include/linux/dpll.h
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2024-02-23 12:32:08 +0000
committerJakub Kicinski <kuba@kernel.org>2024-02-26 18:39:34 -0800
commit0d60d8df6f493bb46bf5db40d39dd60a1bafdd4e (patch)
tree53eed160261aa91dfdd4270e8c5ee634abe138ea /include/linux/dpll.h
parent0e67899abfbfdea0c3c0ed3fd263ffc601c5c157 (diff)
dpll: rely on rcu for netdev_dpll_pin()
This fixes a possible UAF in if_nlmsg_size(), which can run without RTNL. Add rcu protection to "struct dpll_pin" Move netdev_dpll_pin() from netdevice.h to dpll.h to decrease name pollution. Note: This looks possible to no longer acquire RTNL in netdev_dpll_pin_assign() later in net-next. v2: do not force rcu_read_lock() in rtnl_dpll_pin_size() (Jiri Pirko) Fixes: 5f1842692880 ("netdev: expose DPLL pin handle for netdevice") Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Arkadiusz Kubalewski <arkadiusz.kubalewski@intel.com> Cc: Vadim Fedorenko <vadim.fedorenko@linux.dev> Reviewed-by: Jiri Pirko <jiri@nvidia.com> Link: https://lore.kernel.org/r/20240223123208.3543319-1-edumazet@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'include/linux/dpll.h')
-rw-r--r--include/linux/dpll.h11
1 files changed, 11 insertions, 0 deletions
diff --git a/include/linux/dpll.h b/include/linux/dpll.h
index 9cf896ea1d41..4ec2fe9caf5a 100644
--- a/include/linux/dpll.h
+++ b/include/linux/dpll.h
@@ -10,6 +10,8 @@
#include <uapi/linux/dpll.h>
#include <linux/device.h>
#include <linux/netlink.h>
+#include <linux/netdevice.h>
+#include <linux/rtnetlink.h>
struct dpll_device;
struct dpll_pin;
@@ -167,4 +169,13 @@ int dpll_device_change_ntf(struct dpll_device *dpll);
int dpll_pin_change_ntf(struct dpll_pin *pin);
+static inline struct dpll_pin *netdev_dpll_pin(const struct net_device *dev)
+{
+#if IS_ENABLED(CONFIG_DPLL)
+ return rcu_dereference_rtnl(dev->dpll_pin);
+#else
+ return NULL;
+#endif
+}
+
#endif