aboutsummaryrefslogtreecommitdiffstats
path: root/net/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/socket.c')
-rw-r--r--net/socket.c41
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
212int move_addr_to_user(struct sockaddr *kaddr, int klen, void __user *uaddr, 212static 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)
502const struct file_operations bad_sock_fops = { 502const 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}
536EXPORT_SYMBOL(sock_release); 537EXPORT_SYMBOL(sock_release);
537 538
538int sock_tx_timestamp(struct msghdr *msg, struct sock *sk, 539int 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}
548EXPORT_SYMBOL(sock_tx_timestamp); 548EXPORT_SYMBOL(sock_tx_timestamp);
@@ -662,7 +662,8 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
662} 662}
663EXPORT_SYMBOL_GPL(__sock_recv_timestamp); 663EXPORT_SYMBOL_GPL(__sock_recv_timestamp);
664 664
665inline void sock_recv_drops(struct msghdr *msg, struct sock *sk, struct sk_buff *skb) 665static 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}
1145EXPORT_SYMBOL(sock_wake_async); 1146EXPORT_SYMBOL(sock_wake_async);
1146 1147
1147static int __sock_create(struct net *net, int family, int type, int protocol, 1148int __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}
1260EXPORT_SYMBOL(__sock_create);
1259 1261
1260int sock_create(int family, int type, int protocol, struct socket **res) 1262int 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;