Skip to content

Commit f8f8a72

Browse files
author
Al Viro
committed
get_compat_bpf_fprog(): don't copyin field-by-field
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
1 parent 5da028a commit f8f8a72

File tree

1 file changed

+9
-9
lines changed

1 file changed

+9
-9
lines changed

net/compat.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -313,15 +313,15 @@ struct sock_fprog __user *get_compat_bpf_fprog(char __user *optval)
313313
{
314314
struct compat_sock_fprog __user *fprog32 = (struct compat_sock_fprog __user *)optval;
315315
struct sock_fprog __user *kfprog = compat_alloc_user_space(sizeof(struct sock_fprog));
316-
compat_uptr_t ptr;
317-
u16 len;
318-
319-
if (!access_ok(VERIFY_READ, fprog32, sizeof(*fprog32)) ||
320-
!access_ok(VERIFY_WRITE, kfprog, sizeof(struct sock_fprog)) ||
321-
__get_user(len, &fprog32->len) ||
322-
__get_user(ptr, &fprog32->filter) ||
323-
__put_user(len, &kfprog->len) ||
324-
__put_user(compat_ptr(ptr), &kfprog->filter))
316+
struct compat_sock_fprog f32;
317+
struct sock_fprog f;
318+
319+
if (copy_from_user(&f32, fprog32, sizeof(*fprog32)))
320+
return NULL;
321+
memset(&f, 0, sizeof(f));
322+
f.len = f32.len;
323+
f.filter = compat_ptr(f32.filter);
324+
if (copy_to_user(kfprog, &f, sizeof(struct sock_fprog)))
325325
return NULL;
326326

327327
return kfprog;

0 commit comments

Comments
 (0)