net: dsa: strip sysfs "tagging" string of trailing newline
authorVladimir Oltean <vladimir.oltean@nxp.com>
Tue, 15 Nov 2022 01:18:45 +0000 (03:18 +0200)
committerJakub Kicinski <kuba@kernel.org>
Fri, 18 Nov 2022 05:16:42 +0000 (21:16 -0800)
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@nxp.com>
Tested-by: Michael Walle <michael@walle.cc>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/dsa/dsa.c
net/dsa/dsa_priv.h
net/dsa/master.c

index cc6a497..f74ddda 100644 (file)
@@ -79,7 +79,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;
@@ -88,7 +88,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))
index 020386f..4559c0e 100644 (file)
@@ -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);
 
index 421de16..f443bf4 100644 (file)
@@ -299,12 +299,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);