Skip to content

Commit

Permalink
netprio_cgroup: simplify write_priomap()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Tejun Heo committed Nov 22, 2012
1 parent 0ba18f7 commit 6d5759d
Showing 1 changed file with 11 additions and 45 deletions.
56 changes: 11 additions & 45 deletions net/core/netprio_cgroup.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down

0 comments on commit 6d5759d

Please sign in to comment.