From: Alan Tull <atull@kernel.org>
To: Rob Herring <robh+dt@kernel.org>,
Frank Rowand <frowand.list@gmail.com>,
Pantelis Antoniou <pantelis.antoniou@konsulko.com>
Cc: Moritz Fischer <mdf@kernel.org>, Alan Tull <atull@kernel.org>,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-fpga@vger.kernel.org
Subject: [RFC 1/2] of: overlay: add whitelist
Date: Mon, 27 Nov 2017 14:58:03 -0600 [thread overview]
Message-ID: <1511816284-12145-2-git-send-email-atull@kernel.org> (raw)
In-Reply-To: <1511816284-12145-1-git-send-email-atull@kernel.org>
Add simple whitelist. When an overlay is submitted, if any target in
the overlay is not in the whitelist, the overlay is rejected. Drivers
that support dynamic configuration can register their device node with:
int of_add_whitelist_node(struct device_node *np)
and remove themselves with:
void of_remove_whitelist_node(struct device_node *np)
Signed-off-by: Alan Tull <atull@kernel.org>
---
drivers/of/overlay.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++
include/linux/of.h | 12 +++++++++
2 files changed, 85 insertions(+)
diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c
index c150abb..5f952a1 100644
--- a/drivers/of/overlay.c
+++ b/drivers/of/overlay.c
@@ -21,6 +21,7 @@
#include <linux/slab.h>
#include <linux/err.h>
#include <linux/idr.h>
+#include <linux/spinlock.h>
#include "of_private.h"
@@ -646,6 +647,74 @@ static void free_overlay_changeset(struct overlay_changeset *ovcs)
kfree(ovcs);
}
+/* lock for adding/removing device nodes to the whitelist */
+static spinlock_t whitelist_lock;
+
+static struct list_head whitelist_list = LIST_HEAD_INIT(whitelist_list);
+
+struct dt_overlay_whitelist {
+ struct device_node *np;
+ struct list_head node;
+};
+
+int of_add_whitelist_node(struct device_node *np)
+{
+ unsigned long flags;
+ struct dt_overlay_whitelist *wln;
+
+ wln = kzalloc(sizeof(*wln), GFP_KERNEL);
+ if (!wln)
+ return -ENOMEM;
+
+ wln->np = np;
+
+ spin_lock_irqsave(&whitelist_lock, flags);
+ list_add(&wln->node, &whitelist_list);
+ spin_unlock_irqrestore(&whitelist_lock, flags);
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(of_add_whitelist_node);
+
+void of_remove_whitelist_node(struct device_node *np)
+{
+ struct dt_overlay_whitelist *wln;
+ unsigned long flags;
+
+ list_for_each_entry(wln, &whitelist_list, node) {
+ if (np == wln->np) {
+ spin_lock_irqsave(&whitelist_lock, flags);
+ list_del(&wln->node);
+ spin_unlock_irqrestore(&whitelist_lock, flags);
+ kfree(wln);
+ return;
+ }
+ }
+}
+EXPORT_SYMBOL_GPL(of_remove_whitelist_node);
+
+static int of_check_whitelist(struct overlay_changeset *ovcs)
+{
+ struct dt_overlay_whitelist *wln;
+ struct device_node *target;
+ int i;
+
+ for (i = 0; i < ovcs->count; i++) {
+ target = ovcs->fragments[i].target;
+ if (!of_node_cmp(target->name, "__symbols__"))
+ continue;
+
+ list_for_each_entry(wln, &whitelist_list, node)
+ if (target == wln->np)
+ break;
+
+ if (target != wln->np)
+ return -ENODEV;
+ }
+
+ return 0;
+}
+
/**
* of_overlay_apply() - Create and apply an overlay changeset
* @tree: Expanded overlay device tree
@@ -717,6 +786,10 @@ int of_overlay_apply(struct device_node *tree, int *ovcs_id)
if (ret)
goto err_free_overlay_changeset;
+ ret = of_check_whitelist(ovcs);
+ if (ret)
+ goto err_free_overlay_changeset;
+
ret = overlay_notify(ovcs, OF_OVERLAY_PRE_APPLY);
if (ret) {
pr_err("overlay changeset pre-apply notify error %d\n", ret);
diff --git a/include/linux/of.h b/include/linux/of.h
index d3dea1d..5bf652a1 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -1364,6 +1364,9 @@ int of_overlay_remove_all(void);
int of_overlay_notifier_register(struct notifier_block *nb);
int of_overlay_notifier_unregister(struct notifier_block *nb);
+int of_add_whitelist_node(struct device_node *np);
+void of_remove_whitelist_node(struct device_node *np);
+
#else
static inline int of_overlay_apply(struct device_node *tree, int *ovcs_id)
@@ -1391,6 +1394,15 @@ static inline int of_overlay_notifier_unregister(struct notifier_block *nb)
return 0;
}
+static inline int of_add_whitelist_node(struct device_node *np)
+{
+ return 0;
+}
+
+static inline void of_remove_whitelist_node(struct device_node *np)
+{
+}
+
#endif
#endif /* _LINUX_OF_H */
--
2.7.4
next prev parent reply other threads:[~2017-11-27 20:58 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-27 20:58 [RFC 0/2] of: Add whitelist Alan Tull
2017-11-27 20:58 ` Alan Tull [this message]
2017-11-28 15:15 ` [RFC 1/2] of: overlay: add whitelist Rob Herring
2017-11-28 19:26 ` Alan Tull
2017-11-29 9:25 ` Frank Rowand
2017-11-27 20:58 ` [RFC 2/2] fpga: of region: add of-fpga-region to whitelist Alan Tull
2017-11-29 9:20 ` [RFC 0/2] of: Add whitelist Frank Rowand
2017-11-29 13:31 ` Rob Herring
2017-11-29 16:11 ` Alan Tull
2017-11-30 12:46 ` Frank Rowand
2017-12-05 16:33 ` Alan Tull
2017-12-06 11:56 ` Frank Rowand
2017-12-07 19:22 ` Alan Tull
2017-11-30 12:18 ` Frank Rowand
2017-12-05 16:55 ` Alan Tull
2017-12-06 11:47 ` Frank Rowand
2017-11-29 22:47 ` Frank Rowand
2017-11-30 14:39 ` Rob Herring
2017-12-06 11:44 ` Frank Rowand
2017-11-30 0:58 ` Frank Rowand
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1511816284-12145-2-git-send-email-atull@kernel.org \
--to=atull@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=frowand.list@gmail.com \
--cc=linux-fpga@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mdf@kernel.org \
--cc=pantelis.antoniou@konsulko.com \
--cc=robh+dt@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome