diff options
Diffstat (limited to 'net/socket.c')
| -rw-r--r-- | net/socket.c | 41 |
1 files changed, 26 insertions, 15 deletions
diff --git a/net/socket.c b/net/socket.c index 2270b941bcc7..7f67c072d496 100644 --- a/net/socket.c +++ b/net/socket.c | |||
| @@ -209,8 +209,8 @@ int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr *kaddr) | |||
| 209 | * specified. Zero is returned for a success. | 209 | * specified. Zero is returned for a success. |
| 210 | */ | 210 | */ |
| 211 | 211 | ||
| 212 | int move_addr_to_user(struct sockaddr *kaddr, int klen, void __user *uaddr, | 212 | static int move_addr_to_user(struct sockaddr *kaddr, int klen, |
| 213 | int __user *ulen) | 213 | void __user *uaddr, int __user *ulen) |
| 214 | { | 214 | { |
| 215 | int err; | 215 | int err; |
| 216 | int len; | 216 | int len; |
| @@ -502,6 +502,7 @@ static int sock_no_open(struct inode *irrelevant, struct file *dontcare) | |||
| 502 | const struct file_operations bad_sock_fops = { | 502 | const struct file_operations bad_sock_fops = { |
| 503 | .owner = THIS_MODULE, | 503 | .owner = THIS_MODULE, |
| 504 | .open = sock_no_open, | 504 | .open = sock_no_open, |
| 505 | .llseek = noop_llseek, | ||
| 505 | }; | 506 | }; |
| 506 | 507 | ||
| 507 | /** | 508 | /** |
| @@ -535,14 +536,13 @@ void sock_release(struct socket *sock) | |||
| 535 | } | 536 | } |
| 536 | EXPORT_SYMBOL(sock_release); | 537 | EXPORT_SYMBOL(sock_release); |
| 537 | 538 | ||
| 538 | int sock_tx_timestamp(struct msghdr *msg, struct sock *sk, | 539 | int sock_tx_timestamp(struct sock *sk, __u8 *tx_flags) |
| 539 | union skb_shared_tx *shtx) | ||
| 540 | { | 540 | { |
| 541 | shtx->flags = 0; | 541 | *tx_flags = 0; |
| 542 | if (sock_flag(sk, SOCK_TIMESTAMPING_TX_HARDWARE)) | 542 | if (sock_flag(sk, SOCK_TIMESTAMPING_TX_HARDWARE)) |
| 543 | shtx->hardware = 1; | 543 | *tx_flags |= SKBTX_HW_TSTAMP; |
| 544 | if (sock_flag(sk, SOCK_TIMESTAMPING_TX_SOFTWARE)) | 544 | if (sock_flag(sk, SOCK_TIMESTAMPING_TX_SOFTWARE)) |
| 545 | shtx->software = 1; | 545 | *tx_flags |= SKBTX_SW_TSTAMP; |
| 546 | return 0; | 546 | return 0; |
| 547 | } | 547 | } |
| 548 | EXPORT_SYMBOL(sock_tx_timestamp); | 548 | EXPORT_SYMBOL(sock_tx_timestamp); |
| @@ -662,7 +662,8 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk, | |||
| 662 | } | 662 | } |
| 663 | EXPORT_SYMBOL_GPL(__sock_recv_timestamp); | 663 | EXPORT_SYMBOL_GPL(__sock_recv_timestamp); |
| 664 | 664 | ||
| 665 | inline void sock_recv_drops(struct msghdr *msg, struct sock *sk, struct sk_buff *skb) | 665 | static inline void sock_recv_drops(struct msghdr *msg, struct sock *sk, |
| 666 | struct sk_buff *skb) | ||
| 666 | { | 667 | { |
| 667 | if (sock_flag(sk, SOCK_RXQ_OVFL) && skb && skb->dropcount) | 668 | if (sock_flag(sk, SOCK_RXQ_OVFL) && skb && skb->dropcount) |
| 668 | put_cmsg(msg, SOL_SOCKET, SO_RXQ_OVFL, | 669 | put_cmsg(msg, SOL_SOCKET, SO_RXQ_OVFL, |
| @@ -1144,7 +1145,7 @@ call_kill: | |||
| 1144 | } | 1145 | } |
| 1145 | EXPORT_SYMBOL(sock_wake_async); | 1146 | EXPORT_SYMBOL(sock_wake_async); |
| 1146 | 1147 | ||
| 1147 | static int __sock_create(struct net *net, int family, int type, int protocol, | 1148 | int __sock_create(struct net *net, int family, int type, int protocol, |
| 1148 | struct socket **res, int kern) | 1149 | struct socket **res, int kern) |
| 1149 | { | 1150 | { |
| 1150 | int err; | 1151 | int err; |
| @@ -1256,6 +1257,7 @@ out_release: | |||
| 1256 | rcu_read_unlock(); | 1257 | rcu_read_unlock(); |
| 1257 | goto out_sock_release; | 1258 | goto out_sock_release; |
| 1258 | } | 1259 | } |
| 1260 | EXPORT_SYMBOL(__sock_create); | ||
| 1259 | 1261 | ||
| 1260 | int sock_create(int family, int type, int protocol, struct socket **res) | 1262 | int sock_create(int family, int type, int protocol, struct socket **res) |
| 1261 | { | 1263 | { |
| @@ -1919,7 +1921,8 @@ SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned, flags) | |||
| 1919 | * Afterwards, it will be a kernel pointer. Thus the compiler-assisted | 1921 | * Afterwards, it will be a kernel pointer. Thus the compiler-assisted |
| 1920 | * checking falls down on this. | 1922 | * checking falls down on this. |
| 1921 | */ | 1923 | */ |
| 1922 | if (copy_from_user(ctl_buf, (void __user *)msg_sys.msg_control, | 1924 | if (copy_from_user(ctl_buf, |
| 1925 | (void __user __force *)msg_sys.msg_control, | ||
| 1923 | ctl_len)) | 1926 | ctl_len)) |
| 1924 | goto out_freectl; | 1927 | goto out_freectl; |
| 1925 | msg_sys.msg_control = ctl_buf; | 1928 | msg_sys.msg_control = ctl_buf; |
| @@ -3054,14 +3057,19 @@ int kernel_getsockopt(struct socket *sock, int level, int optname, | |||
| 3054 | char *optval, int *optlen) | 3057 | char *optval, int *optlen) |
| 3055 | { | 3058 | { |
| 3056 | mm_segment_t oldfs = get_fs(); | 3059 | mm_segment_t oldfs = get_fs(); |
| 3060 | char __user *uoptval; | ||
| 3061 | int __user *uoptlen; | ||
| 3057 | int err; | 3062 | int err; |
| 3058 | 3063 | ||
| 3064 | uoptval = (char __user __force *) optval; | ||
| 3065 | uoptlen = (int __user __force *) optlen; | ||
| 3066 | |||
| 3059 | set_fs(KERNEL_DS); | 3067 | set_fs(KERNEL_DS); |
| 3060 | if (level == SOL_SOCKET) | 3068 | if (level == SOL_SOCKET) |
| 3061 | err = sock_getsockopt(sock, level, optname, optval, optlen); | 3069 | err = sock_getsockopt(sock, level, optname, uoptval, uoptlen); |
| 3062 | else | 3070 | else |
| 3063 | err = sock->ops->getsockopt(sock, level, optname, optval, | 3071 | err = sock->ops->getsockopt(sock, level, optname, uoptval, |
| 3064 | optlen); | 3072 | uoptlen); |
| 3065 | set_fs(oldfs); | 3073 | set_fs(oldfs); |
| 3066 | return err; | 3074 | return err; |
| 3067 | } | 3075 | } |
| @@ -3071,13 +3079,16 @@ int kernel_setsockopt(struct socket *sock, int level, int optname, | |||
| 3071 | char *optval, unsigned int optlen) | 3079 | char *optval, unsigned int optlen) |
| 3072 | { | 3080 | { |
| 3073 | mm_segment_t oldfs = get_fs(); | 3081 | mm_segment_t oldfs = get_fs(); |
| 3082 | char __user *uoptval; | ||
| 3074 | int err; | 3083 | int err; |
| 3075 | 3084 | ||
| 3085 | uoptval = (char __user __force *) optval; | ||
| 3086 | |||
| 3076 | set_fs(KERNEL_DS); | 3087 | set_fs(KERNEL_DS); |
| 3077 | if (level == SOL_SOCKET) | 3088 | if (level == SOL_SOCKET) |
| 3078 | err = sock_setsockopt(sock, level, optname, optval, optlen); | 3089 | err = sock_setsockopt(sock, level, optname, uoptval, optlen); |
| 3079 | else | 3090 | else |
| 3080 | err = sock->ops->setsockopt(sock, level, optname, optval, | 3091 | err = sock->ops->setsockopt(sock, level, optname, uoptval, |
| 3081 | optlen); | 3092 | optlen); |
| 3082 | set_fs(oldfs); | 3093 | set_fs(oldfs); |
| 3083 | return err; | 3094 | return err; |
