Merge branch 'tun-cleanups'
Markus Elfring says: ==================== tun: Fine-tuning for update_filter() A few update suggestions were taken into account from static source code analysis. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
8238ac0ce2
@ -731,14 +731,9 @@ static int update_filter(struct tap_filter *filter, void __user *arg)
|
||||
}
|
||||
|
||||
alen = ETH_ALEN * uf.count;
|
||||
addr = kmalloc(alen, GFP_KERNEL);
|
||||
if (!addr)
|
||||
return -ENOMEM;
|
||||
|
||||
if (copy_from_user(addr, arg + sizeof(uf), alen)) {
|
||||
err = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
addr = memdup_user(arg + sizeof(uf), alen);
|
||||
if (IS_ERR(addr))
|
||||
return PTR_ERR(addr);
|
||||
|
||||
/* The filter is updated without holding any locks. Which is
|
||||
* perfectly safe. We disable it first and in the worst
|
||||
@ -758,7 +753,7 @@ static int update_filter(struct tap_filter *filter, void __user *arg)
|
||||
for (; n < uf.count; n++) {
|
||||
if (!is_multicast_ether_addr(addr[n].u)) {
|
||||
err = 0; /* no filter */
|
||||
goto done;
|
||||
goto free_addr;
|
||||
}
|
||||
addr_hash_set(filter->mask, addr[n].u);
|
||||
}
|
||||
@ -774,8 +769,7 @@ static int update_filter(struct tap_filter *filter, void __user *arg)
|
||||
|
||||
/* Return the number of exact filters */
|
||||
err = nexact;
|
||||
|
||||
done:
|
||||
free_addr:
|
||||
kfree(addr);
|
||||
return err;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user