|
@@ -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;
|
|
|
}
|