nvmet: filter newlines from user input
authorSagi Grimberg <sagi@grimberg.me>
Wed, 6 Jun 2018 12:27:48 +0000 (15:27 +0300)
committerJens Axboe <axboe@kernel.dk>
Fri, 8 Jun 2018 18:51:10 +0000 (12:51 -0600)
We should avoid consuming the newlines in traddr, trsvcid and
device_path. Add minimal processing to make sure they are gone.

Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/nvme/target/configfs.c

index ad9ff27..d3f3b3e 100644 (file)
@@ -137,8 +137,10 @@ static ssize_t nvmet_addr_traddr_store(struct config_item *item,
                pr_err("Disable the address before modifying\n");
                return -EACCES;
        }
-       return snprintf(port->disc_addr.traddr,
-                       sizeof(port->disc_addr.traddr), "%s", page);
+
+       if (sscanf(page, "%s\n", port->disc_addr.traddr) != 1)
+               return -EINVAL;
+       return count;
 }
 
 CONFIGFS_ATTR(nvmet_, addr_traddr);
@@ -208,8 +210,10 @@ static ssize_t nvmet_addr_trsvcid_store(struct config_item *item,
                pr_err("Disable the address before modifying\n");
                return -EACCES;
        }
-       return snprintf(port->disc_addr.trsvcid,
-                       sizeof(port->disc_addr.trsvcid), "%s", page);
+
+       if (sscanf(page, "%s\n", port->disc_addr.trsvcid) != 1)
+               return -EINVAL;
+       return count;
 }
 
 CONFIGFS_ATTR(nvmet_, addr_trsvcid);
@@ -288,7 +292,7 @@ static ssize_t nvmet_ns_device_path_store(struct config_item *item,
        kfree(ns->device_path);
 
        ret = -ENOMEM;
-       ns->device_path = kstrdup(page, GFP_KERNEL);
+       ns->device_path = kstrndup(page, strcspn(page, "\n"), GFP_KERNEL);
        if (!ns->device_path)
                goto out_unlock;