diff options
Diffstat (limited to 'net/compat.c')
| -rw-r--r-- | net/compat.c | 53 |
1 files changed, 25 insertions, 28 deletions
diff --git a/net/compat.c b/net/compat.c index ec24d9edb025..63d260e81472 100644 --- a/net/compat.c +++ b/net/compat.c | |||
| @@ -81,7 +81,7 @@ int verify_compat_iovec(struct msghdr *kern_msg, struct iovec *kern_iov, | |||
| 81 | int tot_len; | 81 | int tot_len; |
| 82 | 82 | ||
| 83 | if (kern_msg->msg_namelen) { | 83 | if (kern_msg->msg_namelen) { |
| 84 | if (mode==VERIFY_READ) { | 84 | if (mode == VERIFY_READ) { |
| 85 | int err = move_addr_to_kernel(kern_msg->msg_name, | 85 | int err = move_addr_to_kernel(kern_msg->msg_name, |
| 86 | kern_msg->msg_namelen, | 86 | kern_msg->msg_namelen, |
| 87 | kern_address); | 87 | kern_address); |
| @@ -354,7 +354,7 @@ static int do_set_attach_filter(struct socket *sock, int level, int optname, | |||
| 354 | static int do_set_sock_timeout(struct socket *sock, int level, | 354 | static int do_set_sock_timeout(struct socket *sock, int level, |
| 355 | int optname, char __user *optval, unsigned int optlen) | 355 | int optname, char __user *optval, unsigned int optlen) |
| 356 | { | 356 | { |
| 357 | struct compat_timeval __user *up = (struct compat_timeval __user *) optval; | 357 | struct compat_timeval __user *up = (struct compat_timeval __user *)optval; |
| 358 | struct timeval ktime; | 358 | struct timeval ktime; |
| 359 | mm_segment_t old_fs; | 359 | mm_segment_t old_fs; |
| 360 | int err; | 360 | int err; |
| @@ -367,7 +367,7 @@ static int do_set_sock_timeout(struct socket *sock, int level, | |||
| 367 | return -EFAULT; | 367 | return -EFAULT; |
| 368 | old_fs = get_fs(); | 368 | old_fs = get_fs(); |
| 369 | set_fs(KERNEL_DS); | 369 | set_fs(KERNEL_DS); |
| 370 | err = sock_setsockopt(sock, level, optname, (char *) &ktime, sizeof(ktime)); | 370 | err = sock_setsockopt(sock, level, optname, (char *)&ktime, sizeof(ktime)); |
| 371 | set_fs(old_fs); | 371 | set_fs(old_fs); |
| 372 | 372 | ||
| 373 | return err; | 373 | return err; |
| @@ -389,11 +389,10 @@ asmlinkage long compat_sys_setsockopt(int fd, int level, int optname, | |||
| 389 | char __user *optval, unsigned int optlen) | 389 | char __user *optval, unsigned int optlen) |
| 390 | { | 390 | { |
| 391 | int err; | 391 | int err; |
| 392 | struct socket *sock; | 392 | struct socket *sock = sockfd_lookup(fd, &err); |
| 393 | 393 | ||
| 394 | if ((sock = sockfd_lookup(fd, &err))!=NULL) | 394 | if (sock) { |
| 395 | { | 395 | err = security_socket_setsockopt(sock, level, optname); |
| 396 | err = security_socket_setsockopt(sock,level,optname); | ||
| 397 | if (err) { | 396 | if (err) { |
| 398 | sockfd_put(sock); | 397 | sockfd_put(sock); |
| 399 | return err; | 398 | return err; |
| @@ -453,7 +452,7 @@ static int compat_sock_getsockopt(struct socket *sock, int level, int optname, | |||
| 453 | int compat_sock_get_timestamp(struct sock *sk, struct timeval __user *userstamp) | 452 | int compat_sock_get_timestamp(struct sock *sk, struct timeval __user *userstamp) |
| 454 | { | 453 | { |
| 455 | struct compat_timeval __user *ctv = | 454 | struct compat_timeval __user *ctv = |
| 456 | (struct compat_timeval __user*) userstamp; | 455 | (struct compat_timeval __user *) userstamp; |
| 457 | int err = -ENOENT; | 456 | int err = -ENOENT; |
| 458 | struct timeval tv; | 457 | struct timeval tv; |
| 459 | 458 | ||
| @@ -477,7 +476,7 @@ EXPORT_SYMBOL(compat_sock_get_timestamp); | |||
| 477 | int compat_sock_get_timestampns(struct sock *sk, struct timespec __user *userstamp) | 476 | int compat_sock_get_timestampns(struct sock *sk, struct timespec __user *userstamp) |
| 478 | { | 477 | { |
| 479 | struct compat_timespec __user *ctv = | 478 | struct compat_timespec __user *ctv = |
| 480 | (struct compat_timespec __user*) userstamp; | 479 | (struct compat_timespec __user *) userstamp; |
| 481 | int err = -ENOENT; | 480 | int err = -ENOENT; |
| 482 | struct timespec ts; | 481 | struct timespec ts; |
| 483 | 482 | ||
| @@ -502,12 +501,10 @@ asmlinkage long compat_sys_getsockopt(int fd, int level, int optname, | |||
| 502 | char __user *optval, int __user *optlen) | 501 | char __user *optval, int __user *optlen) |
| 503 | { | 502 | { |
| 504 | int err; | 503 | int err; |
| 505 | struct socket *sock; | 504 | struct socket *sock = sockfd_lookup(fd, &err); |
| 506 | 505 | ||
| 507 | if ((sock = sockfd_lookup(fd, &err))!=NULL) | 506 | if (sock) { |
| 508 | { | 507 | err = security_socket_getsockopt(sock, level, optname); |
| 509 | err = security_socket_getsockopt(sock, level, | ||
| 510 | optname); | ||
| 511 | if (err) { | 508 | if (err) { |
| 512 | sockfd_put(sock); | 509 | sockfd_put(sock); |
| 513 | return err; | 510 | return err; |
| @@ -531,7 +528,7 @@ struct compat_group_req { | |||
| 531 | __u32 gr_interface; | 528 | __u32 gr_interface; |
| 532 | struct __kernel_sockaddr_storage gr_group | 529 | struct __kernel_sockaddr_storage gr_group |
| 533 | __attribute__ ((aligned(4))); | 530 | __attribute__ ((aligned(4))); |
| 534 | } __attribute__ ((packed)); | 531 | } __packed; |
| 535 | 532 | ||
| 536 | struct compat_group_source_req { | 533 | struct compat_group_source_req { |
| 537 | __u32 gsr_interface; | 534 | __u32 gsr_interface; |
| @@ -539,7 +536,7 @@ struct compat_group_source_req { | |||
| 539 | __attribute__ ((aligned(4))); | 536 | __attribute__ ((aligned(4))); |
| 540 | struct __kernel_sockaddr_storage gsr_source | 537 | struct __kernel_sockaddr_storage gsr_source |
| 541 | __attribute__ ((aligned(4))); | 538 | __attribute__ ((aligned(4))); |
| 542 | } __attribute__ ((packed)); | 539 | } __packed; |
| 543 | 540 | ||
| 544 | struct compat_group_filter { | 541 | struct compat_group_filter { |
| 545 | __u32 gf_interface; | 542 | __u32 gf_interface; |
| @@ -549,7 +546,7 @@ struct compat_group_filter { | |||
| 549 | __u32 gf_numsrc; | 546 | __u32 gf_numsrc; |
| 550 | struct __kernel_sockaddr_storage gf_slist[1] | 547 | struct __kernel_sockaddr_storage gf_slist[1] |
| 551 | __attribute__ ((aligned(4))); | 548 | __attribute__ ((aligned(4))); |
| 552 | } __attribute__ ((packed)); | 549 | } __packed; |
| 553 | 550 | ||
| 554 | #define __COMPAT_GF0_SIZE (sizeof(struct compat_group_filter) - \ | 551 | #define __COMPAT_GF0_SIZE (sizeof(struct compat_group_filter) - \ |
| 555 | sizeof(struct __kernel_sockaddr_storage)) | 552 | sizeof(struct __kernel_sockaddr_storage)) |
| @@ -557,7 +554,7 @@ struct compat_group_filter { | |||
| 557 | 554 | ||
| 558 | int compat_mc_setsockopt(struct sock *sock, int level, int optname, | 555 | int compat_mc_setsockopt(struct sock *sock, int level, int optname, |
| 559 | char __user *optval, unsigned int optlen, | 556 | char __user *optval, unsigned int optlen, |
| 560 | int (*setsockopt)(struct sock *,int,int,char __user *,unsigned int)) | 557 | int (*setsockopt)(struct sock *, int, int, char __user *, unsigned int)) |
| 561 | { | 558 | { |
| 562 | char __user *koptval = optval; | 559 | char __user *koptval = optval; |
| 563 | int koptlen = optlen; | 560 | int koptlen = optlen; |
| @@ -640,12 +637,11 @@ int compat_mc_setsockopt(struct sock *sock, int level, int optname, | |||
| 640 | } | 637 | } |
| 641 | return setsockopt(sock, level, optname, koptval, koptlen); | 638 | return setsockopt(sock, level, optname, koptval, koptlen); |
| 642 | } | 639 | } |
| 643 | |||
| 644 | EXPORT_SYMBOL(compat_mc_setsockopt); | 640 | EXPORT_SYMBOL(compat_mc_setsockopt); |
| 645 | 641 | ||
| 646 | int compat_mc_getsockopt(struct sock *sock, int level, int optname, | 642 | int compat_mc_getsockopt(struct sock *sock, int level, int optname, |
| 647 | char __user *optval, int __user *optlen, | 643 | char __user *optval, int __user *optlen, |
| 648 | int (*getsockopt)(struct sock *,int,int,char __user *,int __user *)) | 644 | int (*getsockopt)(struct sock *, int, int, char __user *, int __user *)) |
| 649 | { | 645 | { |
| 650 | struct compat_group_filter __user *gf32 = (void *)optval; | 646 | struct compat_group_filter __user *gf32 = (void *)optval; |
| 651 | struct group_filter __user *kgf; | 647 | struct group_filter __user *kgf; |
| @@ -681,7 +677,7 @@ int compat_mc_getsockopt(struct sock *sock, int level, int optname, | |||
| 681 | __put_user(interface, &kgf->gf_interface) || | 677 | __put_user(interface, &kgf->gf_interface) || |
| 682 | __put_user(fmode, &kgf->gf_fmode) || | 678 | __put_user(fmode, &kgf->gf_fmode) || |
| 683 | __put_user(numsrc, &kgf->gf_numsrc) || | 679 | __put_user(numsrc, &kgf->gf_numsrc) || |
| 684 | copy_in_user(&kgf->gf_group,&gf32->gf_group,sizeof(kgf->gf_group))) | 680 | copy_in_user(&kgf->gf_group, &gf32->gf_group, sizeof(kgf->gf_group))) |
| 685 | return -EFAULT; | 681 | return -EFAULT; |
| 686 | 682 | ||
| 687 | err = getsockopt(sock, level, optname, (char __user *)kgf, koptlen); | 683 | err = getsockopt(sock, level, optname, (char __user *)kgf, koptlen); |
| @@ -714,21 +710,22 @@ int compat_mc_getsockopt(struct sock *sock, int level, int optname, | |||
| 714 | copylen = numsrc * sizeof(gf32->gf_slist[0]); | 710 | copylen = numsrc * sizeof(gf32->gf_slist[0]); |
| 715 | if (copylen > klen) | 711 | if (copylen > klen) |
| 716 | copylen = klen; | 712 | copylen = klen; |
| 717 | if (copy_in_user(gf32->gf_slist, kgf->gf_slist, copylen)) | 713 | if (copy_in_user(gf32->gf_slist, kgf->gf_slist, copylen)) |
| 718 | return -EFAULT; | 714 | return -EFAULT; |
| 719 | } | 715 | } |
| 720 | return err; | 716 | return err; |
| 721 | } | 717 | } |
| 722 | |||
| 723 | EXPORT_SYMBOL(compat_mc_getsockopt); | 718 | EXPORT_SYMBOL(compat_mc_getsockopt); |
| 724 | 719 | ||
| 725 | 720 | ||
| 726 | /* Argument list sizes for compat_sys_socketcall */ | 721 | /* Argument list sizes for compat_sys_socketcall */ |
| 727 | #define AL(x) ((x) * sizeof(u32)) | 722 | #define AL(x) ((x) * sizeof(u32)) |
| 728 | static unsigned char nas[20]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), | 723 | static unsigned char nas[20] = { |
| 729 | AL(3),AL(3),AL(4),AL(4),AL(4),AL(6), | 724 | AL(0), AL(3), AL(3), AL(3), AL(2), AL(3), |
| 730 | AL(6),AL(2),AL(5),AL(5),AL(3),AL(3), | 725 | AL(3), AL(3), AL(4), AL(4), AL(4), AL(6), |
| 731 | AL(4),AL(5)}; | 726 | AL(6), AL(2), AL(5), AL(5), AL(3), AL(3), |
| 727 | AL(4), AL(5) | ||
| 728 | }; | ||
| 732 | #undef AL | 729 | #undef AL |
| 733 | 730 | ||
| 734 | asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, unsigned flags) | 731 | asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, unsigned flags) |
| @@ -827,7 +824,7 @@ asmlinkage long compat_sys_socketcall(int call, u32 __user *args) | |||
| 827 | compat_ptr(a[4]), compat_ptr(a[5])); | 824 | compat_ptr(a[4]), compat_ptr(a[5])); |
| 828 | break; | 825 | break; |
| 829 | case SYS_SHUTDOWN: | 826 | case SYS_SHUTDOWN: |
| 830 | ret = sys_shutdown(a0,a1); | 827 | ret = sys_shutdown(a0, a1); |
| 831 | break; | 828 | break; |
| 832 | case SYS_SETSOCKOPT: | 829 | case SYS_SETSOCKOPT: |
| 833 | ret = compat_sys_setsockopt(a0, a1, a[2], | 830 | ret = compat_sys_setsockopt(a0, a1, a[2], |
