diff options
Diffstat (limited to 'net/socket.c')
| -rw-r--r-- | net/socket.c | 65 | 
1 files changed, 28 insertions, 37 deletions
diff --git a/net/socket.c b/net/socket.c index b2d7c629eeb9..ebed4b68f768 100644 --- a/net/socket.c +++ b/net/socket.c  | |||
| @@ -854,11 +854,6 @@ int kernel_recvmsg(struct socket *sock, struct msghdr *msg, | |||
| 854 | } | 854 | } | 
| 855 | EXPORT_SYMBOL(kernel_recvmsg); | 855 | EXPORT_SYMBOL(kernel_recvmsg); | 
| 856 | 856 | ||
| 857 | static void sock_aio_dtor(struct kiocb *iocb) | ||
| 858 | { | ||
| 859 | kfree(iocb->private); | ||
| 860 | } | ||
| 861 | |||
| 862 | static ssize_t sock_sendpage(struct file *file, struct page *page, | 857 | static ssize_t sock_sendpage(struct file *file, struct page *page, | 
| 863 | int offset, size_t size, loff_t *ppos, int more) | 858 | int offset, size_t size, loff_t *ppos, int more) | 
| 864 | { | 859 | { | 
| @@ -889,12 +884,8 @@ static ssize_t sock_splice_read(struct file *file, loff_t *ppos, | |||
| 889 | static struct sock_iocb *alloc_sock_iocb(struct kiocb *iocb, | 884 | static struct sock_iocb *alloc_sock_iocb(struct kiocb *iocb, | 
| 890 | struct sock_iocb *siocb) | 885 | struct sock_iocb *siocb) | 
| 891 | { | 886 | { | 
| 892 | if (!is_sync_kiocb(iocb)) { | 887 | if (!is_sync_kiocb(iocb)) | 
| 893 | siocb = kmalloc(sizeof(*siocb), GFP_KERNEL); | 888 | BUG(); | 
| 894 | if (!siocb) | ||
| 895 | return NULL; | ||
| 896 | iocb->ki_dtor = sock_aio_dtor; | ||
| 897 | } | ||
| 898 | 889 | ||
| 899 | siocb->kiocb = iocb; | 890 | siocb->kiocb = iocb; | 
| 900 | iocb->private = siocb; | 891 | iocb->private = siocb; | 
| @@ -931,7 +922,7 @@ static ssize_t sock_aio_read(struct kiocb *iocb, const struct iovec *iov, | |||
| 931 | if (pos != 0) | 922 | if (pos != 0) | 
| 932 | return -ESPIPE; | 923 | return -ESPIPE; | 
| 933 | 924 | ||
| 934 | if (iocb->ki_left == 0) /* Match SYS5 behaviour */ | 925 | if (iocb->ki_nbytes == 0) /* Match SYS5 behaviour */ | 
| 935 | return 0; | 926 | return 0; | 
| 936 | 927 | ||
| 937 | 928 | ||
| @@ -3072,12 +3063,12 @@ static int compat_sioc_ifmap(struct net *net, unsigned int cmd, | |||
| 3072 | 3063 | ||
| 3073 | uifmap32 = &uifr32->ifr_ifru.ifru_map; | 3064 | uifmap32 = &uifr32->ifr_ifru.ifru_map; | 
| 3074 | err = copy_from_user(&ifr, uifr32, sizeof(ifr.ifr_name)); | 3065 | err = copy_from_user(&ifr, uifr32, sizeof(ifr.ifr_name)); | 
| 3075 | err |= __get_user(ifr.ifr_map.mem_start, &uifmap32->mem_start); | 3066 | err |= get_user(ifr.ifr_map.mem_start, &uifmap32->mem_start); | 
| 3076 | err |= __get_user(ifr.ifr_map.mem_end, &uifmap32->mem_end); | 3067 | err |= get_user(ifr.ifr_map.mem_end, &uifmap32->mem_end); | 
| 3077 | err |= __get_user(ifr.ifr_map.base_addr, &uifmap32->base_addr); | 3068 | err |= get_user(ifr.ifr_map.base_addr, &uifmap32->base_addr); | 
| 3078 | err |= __get_user(ifr.ifr_map.irq, &uifmap32->irq); | 3069 | err |= get_user(ifr.ifr_map.irq, &uifmap32->irq); | 
| 3079 | err |= __get_user(ifr.ifr_map.dma, &uifmap32->dma); | 3070 | err |= get_user(ifr.ifr_map.dma, &uifmap32->dma); | 
| 3080 | err |= __get_user(ifr.ifr_map.port, &uifmap32->port); | 3071 | err |= get_user(ifr.ifr_map.port, &uifmap32->port); | 
| 3081 | if (err) | 3072 | if (err) | 
| 3082 | return -EFAULT; | 3073 | return -EFAULT; | 
| 3083 | 3074 | ||
| @@ -3088,12 +3079,12 @@ static int compat_sioc_ifmap(struct net *net, unsigned int cmd, | |||
| 3088 | 3079 | ||
| 3089 | if (cmd == SIOCGIFMAP && !err) { | 3080 | if (cmd == SIOCGIFMAP && !err) { | 
| 3090 | err = copy_to_user(uifr32, &ifr, sizeof(ifr.ifr_name)); | 3081 | err = copy_to_user(uifr32, &ifr, sizeof(ifr.ifr_name)); | 
| 3091 | err |= __put_user(ifr.ifr_map.mem_start, &uifmap32->mem_start); | 3082 | err |= put_user(ifr.ifr_map.mem_start, &uifmap32->mem_start); | 
| 3092 | err |= __put_user(ifr.ifr_map.mem_end, &uifmap32->mem_end); | 3083 | err |= put_user(ifr.ifr_map.mem_end, &uifmap32->mem_end); | 
| 3093 | err |= __put_user(ifr.ifr_map.base_addr, &uifmap32->base_addr); | 3084 | err |= put_user(ifr.ifr_map.base_addr, &uifmap32->base_addr); | 
| 3094 | err |= __put_user(ifr.ifr_map.irq, &uifmap32->irq); | 3085 | err |= put_user(ifr.ifr_map.irq, &uifmap32->irq); | 
| 3095 | err |= __put_user(ifr.ifr_map.dma, &uifmap32->dma); | 3086 | err |= put_user(ifr.ifr_map.dma, &uifmap32->dma); | 
| 3096 | err |= __put_user(ifr.ifr_map.port, &uifmap32->port); | 3087 | err |= put_user(ifr.ifr_map.port, &uifmap32->port); | 
| 3097 | if (err) | 3088 | if (err) | 
| 3098 | err = -EFAULT; | 3089 | err = -EFAULT; | 
| 3099 | } | 3090 | } | 
| @@ -3167,25 +3158,25 @@ static int routing_ioctl(struct net *net, struct socket *sock, | |||
| 3167 | struct in6_rtmsg32 __user *ur6 = argp; | 3158 | struct in6_rtmsg32 __user *ur6 = argp; | 
| 3168 | ret = copy_from_user(&r6.rtmsg_dst, &(ur6->rtmsg_dst), | 3159 | ret = copy_from_user(&r6.rtmsg_dst, &(ur6->rtmsg_dst), | 
| 3169 | 3 * sizeof(struct in6_addr)); | 3160 | 3 * sizeof(struct in6_addr)); | 
| 3170 | ret |= __get_user(r6.rtmsg_type, &(ur6->rtmsg_type)); | 3161 | ret |= get_user(r6.rtmsg_type, &(ur6->rtmsg_type)); | 
| 3171 | ret |= __get_user(r6.rtmsg_dst_len, &(ur6->rtmsg_dst_len)); | 3162 | ret |= get_user(r6.rtmsg_dst_len, &(ur6->rtmsg_dst_len)); | 
| 3172 | ret |= __get_user(r6.rtmsg_src_len, &(ur6->rtmsg_src_len)); | 3163 | ret |= get_user(r6.rtmsg_src_len, &(ur6->rtmsg_src_len)); | 
| 3173 | ret |= __get_user(r6.rtmsg_metric, &(ur6->rtmsg_metric)); | 3164 | ret |= get_user(r6.rtmsg_metric, &(ur6->rtmsg_metric)); | 
| 3174 | ret |= __get_user(r6.rtmsg_info, &(ur6->rtmsg_info)); | 3165 | ret |= get_user(r6.rtmsg_info, &(ur6->rtmsg_info)); | 
| 3175 | ret |= __get_user(r6.rtmsg_flags, &(ur6->rtmsg_flags)); | 3166 | ret |= get_user(r6.rtmsg_flags, &(ur6->rtmsg_flags)); | 
| 3176 | ret |= __get_user(r6.rtmsg_ifindex, &(ur6->rtmsg_ifindex)); | 3167 | ret |= get_user(r6.rtmsg_ifindex, &(ur6->rtmsg_ifindex)); | 
| 3177 | 3168 | ||
| 3178 | r = (void *) &r6; | 3169 | r = (void *) &r6; | 
| 3179 | } else { /* ipv4 */ | 3170 | } else { /* ipv4 */ | 
| 3180 | struct rtentry32 __user *ur4 = argp; | 3171 | struct rtentry32 __user *ur4 = argp; | 
| 3181 | ret = copy_from_user(&r4.rt_dst, &(ur4->rt_dst), | 3172 | ret = copy_from_user(&r4.rt_dst, &(ur4->rt_dst), | 
| 3182 | 3 * sizeof(struct sockaddr)); | 3173 | 3 * sizeof(struct sockaddr)); | 
| 3183 | ret |= __get_user(r4.rt_flags, &(ur4->rt_flags)); | 3174 | ret |= get_user(r4.rt_flags, &(ur4->rt_flags)); | 
| 3184 | ret |= __get_user(r4.rt_metric, &(ur4->rt_metric)); | 3175 | ret |= get_user(r4.rt_metric, &(ur4->rt_metric)); | 
| 3185 | ret |= __get_user(r4.rt_mtu, &(ur4->rt_mtu)); | 3176 | ret |= get_user(r4.rt_mtu, &(ur4->rt_mtu)); | 
| 3186 | ret |= __get_user(r4.rt_window, &(ur4->rt_window)); | 3177 | ret |= get_user(r4.rt_window, &(ur4->rt_window)); | 
| 3187 | ret |= __get_user(r4.rt_irtt, &(ur4->rt_irtt)); | 3178 | ret |= get_user(r4.rt_irtt, &(ur4->rt_irtt)); | 
| 3188 | ret |= __get_user(rtdev, &(ur4->rt_dev)); | 3179 | ret |= get_user(rtdev, &(ur4->rt_dev)); | 
| 3189 | if (rtdev) { | 3180 | if (rtdev) { | 
| 3190 | ret |= copy_from_user(devname, compat_ptr(rtdev), 15); | 3181 | ret |= copy_from_user(devname, compat_ptr(rtdev), 15); | 
| 3191 | r4.rt_dev = (char __user __force *)devname; | 3182 | r4.rt_dev = (char __user __force *)devname; | 
