[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20221115011847.2843127-5-vladimir.oltean@nxp.com>
Date: Tue, 15 Nov 2022 03:18:45 +0200
From: Vladimir Oltean <vladimir.oltean@....com>
To: netdev@...r.kernel.org
Cc: Andrew Lunn <andrew@...n.ch>,
Florian Fainelli <f.fainelli@...il.com>,
Vladimir Oltean <olteanv@...il.com>,
"David S. Miller" <davem@...emloft.net>,
Eric Dumazet <edumazet@...gle.com>,
Jakub Kicinski <kuba@...nel.org>,
Paolo Abeni <pabeni@...hat.com>,
Michael Walle <michael@...le.cc>,
Heiko Thiery <heiko.thiery@...il.com>
Subject: [PATCH v2 net-next 4/6] net: dsa: strip sysfs "tagging" string of trailing newline
Currently, dsa_find_tagger_by_name() uses sysfs_streq() which works both
with strings that contain \n at the end (echo ocelot > .../dsa/tagging)
and with strings that don't (printf ocelot > .../dsa/tagging).
There will be a problem once we'll want to construct the modalias string
based on which we auto-load the protocol kernel module. If the sysfs
buffer ends in a newline, we need to strip it first. This is a
preparatory patch specifically for that.
Signed-off-by: Vladimir Oltean <vladimir.oltean@....com>
---
v1->v2: patch is new
net/dsa/dsa.c | 4 ++--
net/dsa/dsa_priv.h | 2 +-
net/dsa/master.c | 13 ++++++++++++-
3 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c
index 38c64cc5c0d2..e0ea5b309e61 100644
--- a/net/dsa/dsa.c
+++ b/net/dsa/dsa.c
@@ -78,7 +78,7 @@ const char *dsa_tag_protocol_to_str(const struct dsa_device_ops *ops)
/* Function takes a reference on the module owning the tagger,
* so dsa_tag_driver_put must be called afterwards.
*/
-const struct dsa_device_ops *dsa_find_tagger_by_name(const char *buf)
+const struct dsa_device_ops *dsa_find_tagger_by_name(const char *name)
{
const struct dsa_device_ops *ops = ERR_PTR(-ENOPROTOOPT);
struct dsa_tag_driver *dsa_tag_driver;
@@ -87,7 +87,7 @@ const struct dsa_device_ops *dsa_find_tagger_by_name(const char *buf)
list_for_each_entry(dsa_tag_driver, &dsa_tag_drivers_list, list) {
const struct dsa_device_ops *tmp = dsa_tag_driver->ops;
- if (!sysfs_streq(buf, tmp->name))
+ if (strcmp(name, tmp->name))
continue;
if (!try_module_get(dsa_tag_driver->owner))
diff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h
index b4b8fe4ed9bf..9fe68d3ae2f5 100644
--- a/net/dsa/dsa_priv.h
+++ b/net/dsa/dsa_priv.h
@@ -245,7 +245,7 @@ struct dsa_slave_priv {
/* dsa.c */
const struct dsa_device_ops *dsa_tag_driver_get(int tag_protocol);
void dsa_tag_driver_put(const struct dsa_device_ops *ops);
-const struct dsa_device_ops *dsa_find_tagger_by_name(const char *buf);
+const struct dsa_device_ops *dsa_find_tagger_by_name(const char *name);
bool dsa_db_equal(const struct dsa_db *a, const struct dsa_db *b);
diff --git a/net/dsa/master.c b/net/dsa/master.c
index 40367ab41cf8..104eab880076 100644
--- a/net/dsa/master.c
+++ b/net/dsa/master.c
@@ -300,12 +300,23 @@ static ssize_t tagging_store(struct device *d, struct device_attribute *attr,
const char *buf, size_t count)
{
const struct dsa_device_ops *new_tag_ops, *old_tag_ops;
+ const char *end = strchrnul(buf, '\n'), *name;
struct net_device *dev = to_net_dev(d);
struct dsa_port *cpu_dp = dev->dsa_ptr;
+ size_t len = end - buf;
int err;
+ /* Empty string passed */
+ if (!len)
+ return -ENOPROTOOPT;
+
+ name = kstrndup(buf, len, GFP_KERNEL);
+ if (!name)
+ return -ENOMEM;
+
old_tag_ops = cpu_dp->tag_ops;
- new_tag_ops = dsa_find_tagger_by_name(buf);
+ new_tag_ops = dsa_find_tagger_by_name(name);
+ kfree(name);
/* Bad tagger name, or module is not loaded? */
if (IS_ERR(new_tag_ops))
return PTR_ERR(new_tag_ops);
--
2.34.1
Powered by blists - more mailing lists