|
@@ -644,7 +644,6 @@ void sk_filter_release_rcu(struct rcu_head *rcu)
|
|
|
struct sk_filter *fp = container_of(rcu, struct sk_filter, rcu);
|
|
|
|
|
|
bpf_jit_free(fp);
|
|
|
- kfree(fp);
|
|
|
}
|
|
|
EXPORT_SYMBOL(sk_filter_release_rcu);
|
|
|
|
|
@@ -683,7 +682,7 @@ int sk_unattached_filter_create(struct sk_filter **pfp,
|
|
|
if (fprog->filter == NULL)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- fp = kmalloc(fsize + sizeof(*fp), GFP_KERNEL);
|
|
|
+ fp = kmalloc(sk_filter_size(fprog->len), GFP_KERNEL);
|
|
|
if (!fp)
|
|
|
return -ENOMEM;
|
|
|
memcpy(fp->insns, fprog->filter, fsize);
|
|
@@ -723,6 +722,7 @@ int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk)
|
|
|
{
|
|
|
struct sk_filter *fp, *old_fp;
|
|
|
unsigned int fsize = sizeof(struct sock_filter) * fprog->len;
|
|
|
+ unsigned int sk_fsize = sk_filter_size(fprog->len);
|
|
|
int err;
|
|
|
|
|
|
if (sock_flag(sk, SOCK_FILTER_LOCKED))
|
|
@@ -732,11 +732,11 @@ int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk)
|
|
|
if (fprog->filter == NULL)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- fp = sock_kmalloc(sk, fsize+sizeof(*fp), GFP_KERNEL);
|
|
|
+ fp = sock_kmalloc(sk, sk_fsize, GFP_KERNEL);
|
|
|
if (!fp)
|
|
|
return -ENOMEM;
|
|
|
if (copy_from_user(fp->insns, fprog->filter, fsize)) {
|
|
|
- sock_kfree_s(sk, fp, fsize+sizeof(*fp));
|
|
|
+ sock_kfree_s(sk, fp, sk_fsize);
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
|