]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - net/socket.c
ptrace: cleanup arch_ptrace() on x86
[net-next-2.6.git] / net / socket.c
index 9eac5c3941340c60343233402886780117aa93d3..ee3cd280c76e9cfb58024fa22f3017352f0467bc 100644 (file)
@@ -209,8 +209,8 @@ int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr *kaddr)
  *     specified. Zero is returned for a success.
  */
 
-int move_addr_to_user(struct sockaddr *kaddr, int klen, void __user *uaddr,
-                     int __user *ulen)
+static int move_addr_to_user(struct sockaddr *kaddr, int klen,
+                            void __user *uaddr, int __user *ulen)
 {
        int err;
        int len;
@@ -377,7 +377,7 @@ static int sock_alloc_file(struct socket *sock, struct file **f, int flags)
                  &socket_file_ops);
        if (unlikely(!file)) {
                /* drop dentry, keep inode */
-               atomic_inc(&path.dentry->d_inode->i_count);
+               ihold(path.dentry->d_inode);
                path_put(&path);
                put_unused_fd(fd);
                return -ENFILE;
@@ -480,6 +480,7 @@ static struct socket *sock_alloc(void)
        sock = SOCKET_I(inode);
 
        kmemcheck_annotate_bitfield(sock, type);
+       inode->i_ino = get_next_ino();
        inode->i_mode = S_IFSOCK | S_IRWXUGO;
        inode->i_uid = current_fsuid();
        inode->i_gid = current_fsgid();
@@ -536,14 +537,13 @@ void sock_release(struct socket *sock)
 }
 EXPORT_SYMBOL(sock_release);
 
-int sock_tx_timestamp(struct msghdr *msg, struct sock *sk,
-                     union skb_shared_tx *shtx)
+int sock_tx_timestamp(struct sock *sk, __u8 *tx_flags)
 {
-       shtx->flags = 0;
+       *tx_flags = 0;
        if (sock_flag(sk, SOCK_TIMESTAMPING_TX_HARDWARE))
-               shtx->hardware = 1;
+               *tx_flags |= SKBTX_HW_TSTAMP;
        if (sock_flag(sk, SOCK_TIMESTAMPING_TX_SOFTWARE))
-               shtx->software = 1;
+               *tx_flags |= SKBTX_SW_TSTAMP;
        return 0;
 }
 EXPORT_SYMBOL(sock_tx_timestamp);
@@ -663,7 +663,8 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
 }
 EXPORT_SYMBOL_GPL(__sock_recv_timestamp);
 
-inline void sock_recv_drops(struct msghdr *msg, struct sock *sk, struct sk_buff *skb)
+static inline void sock_recv_drops(struct msghdr *msg, struct sock *sk,
+                                  struct sk_buff *skb)
 {
        if (sock_flag(sk, SOCK_RXQ_OVFL) && skb && skb->dropcount)
                put_cmsg(msg, SOL_SOCKET, SO_RXQ_OVFL,
@@ -1145,7 +1146,7 @@ call_kill:
 }
 EXPORT_SYMBOL(sock_wake_async);
 
-static int __sock_create(struct net *net, int family, int type, int protocol,
+int __sock_create(struct net *net, int family, int type, int protocol,
                         struct socket **res, int kern)
 {
        int err;
@@ -1257,6 +1258,7 @@ out_release:
        rcu_read_unlock();
        goto out_sock_release;
 }
+EXPORT_SYMBOL(__sock_create);
 
 int sock_create(int family, int type, int protocol, struct socket **res)
 {
@@ -1920,7 +1922,8 @@ SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned, flags)
                 * Afterwards, it will be a kernel pointer. Thus the compiler-assisted
                 * checking falls down on this.
                 */
-               if (copy_from_user(ctl_buf, (void __user *)msg_sys.msg_control,
+               if (copy_from_user(ctl_buf,
+                                  (void __user __force *)msg_sys.msg_control,
                                   ctl_len))
                        goto out_freectl;
                msg_sys.msg_control = ctl_buf;
@@ -3055,14 +3058,19 @@ int kernel_getsockopt(struct socket *sock, int level, int optname,
                        char *optval, int *optlen)
 {
        mm_segment_t oldfs = get_fs();
+       char __user *uoptval;
+       int __user *uoptlen;
        int err;
 
+       uoptval = (char __user __force *) optval;
+       uoptlen = (int __user __force *) optlen;
+
        set_fs(KERNEL_DS);
        if (level == SOL_SOCKET)
-               err = sock_getsockopt(sock, level, optname, optval, optlen);
+               err = sock_getsockopt(sock, level, optname, uoptval, uoptlen);
        else
-               err = sock->ops->getsockopt(sock, level, optname, optval,
-                                           optlen);
+               err = sock->ops->getsockopt(sock, level, optname, uoptval,
+                                           uoptlen);
        set_fs(oldfs);
        return err;
 }
@@ -3072,13 +3080,16 @@ int kernel_setsockopt(struct socket *sock, int level, int optname,
                        char *optval, unsigned int optlen)
 {
        mm_segment_t oldfs = get_fs();
+       char __user *uoptval;
        int err;
 
+       uoptval = (char __user __force *) optval;
+
        set_fs(KERNEL_DS);
        if (level == SOL_SOCKET)
-               err = sock_setsockopt(sock, level, optname, optval, optlen);
+               err = sock_setsockopt(sock, level, optname, uoptval, optlen);
        else
-               err = sock->ops->setsockopt(sock, level, optname, optval,
+               err = sock->ops->setsockopt(sock, level, optname, uoptval,
                                            optlen);
        set_fs(oldfs);
        return err;