mirror of https://gitee.com/openkylin/linux.git
netprio_cgroup: simplify write_priomap()
sscanf() doesn't bite. Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: Neil Horman <nhorman@tuxdriver.com> Tested-and-Acked-by: Daniel Wagner <daniel.wagner@bmw-carit.de> Acked-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
0ba18f7a5e
commit
6d5759dd02
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue