Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6d5759dd authored by Tejun Heo's avatar Tejun Heo
Browse files

netprio_cgroup: simplify write_priomap()



sscanf() doesn't bite.

Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Acked-by: default avatarNeil Horman <nhorman@tuxdriver.com>
Tested-and-Acked-by: default avatarDaniel Wagner <daniel.wagner@bmw-carit.de>
Acked-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0ba18f7a
Loading
Loading
Loading
Loading
+11 −45
Original line number Diff line number Diff line
@@ -176,66 +176,32 @@ static int read_priomap(struct cgroup *cont, struct cftype *cft,
static int write_priomap(struct cgroup *cgrp, struct cftype *cft,
			 const char *buffer)
{
	char *devname = kstrdup(buffer, GFP_KERNEL);
	int ret = -EINVAL;
	u32 prioidx = cgrp_netprio_state(cgrp)->prioidx;
	unsigned long priority;
	char *priostr;
	char devname[IFNAMSIZ + 1];
	struct net_device *dev;
	struct netprio_map *map;
	u32 prio;
	int ret;

	if (!devname)
		return -ENOMEM;

	/*
	 * Minimally sized valid priomap string
	 */
	if (strlen(devname) < 3)
		goto out_free_devname;

	priostr = strstr(devname, " ");
	if (!priostr)
		goto out_free_devname;

	/*
	 *Separate the devname from the associated priority
	 *and advance the priostr pointer to the priority value
	 */
	*priostr = '\0';
	priostr++;

	/*
	 * If the priostr points to NULL, we're at the end of the passed
	 * in string, and its not a valid write
	 */
	if (*priostr == '\0')
		goto out_free_devname;

	ret = kstrtoul(priostr, 10, &priority);
	if (ret < 0)
		goto out_free_devname;

	ret = -ENODEV;
	if (sscanf(buffer, "%"__stringify(IFNAMSIZ)"s %u", devname, &prio) != 2)
		return -EINVAL;

	dev = dev_get_by_name(&init_net, devname);
	if (!dev)
		goto out_free_devname;
		return -ENODEV;

	rtnl_lock();

	ret = write_update_netdev_table(dev);
	if (ret < 0)
		goto out_put_dev;
	if (ret)
		goto out_unlock;

	map = rtnl_dereference(dev->priomap);
	if (map)
		map->priomap[prioidx] = priority;

out_put_dev:
		map->priomap[prioidx] = prio;
out_unlock:
	rtnl_unlock();
	dev_put(dev);

out_free_devname:
	kfree(devname);
	return ret;
}