net/tcp: switch ->md5_parse to sockptr_t
authorChristoph Hellwig <hch@lst.de>
Thu, 23 Jul 2020 06:09:05 +0000 (08:09 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 24 Jul 2020 22:41:54 +0000 (15:41 -0700)
Pass a sockptr_t to prepare for set_fs-less handling of the kernel
pointer from bpf-cgroup.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/tcp.h
net/ipv4/tcp.c
net/ipv4/tcp_ipv4.c
net/ipv6/tcp_ipv6.c

index 9f7f7c0..e3c8e1d 100644 (file)
@@ -2002,7 +2002,7 @@ struct tcp_sock_af_ops {
                                         const struct sk_buff *skb);
        int             (*md5_parse)(struct sock *sk,
                                     int optname,
-                                    char __user *optval,
+                                    sockptr_t optval,
                                     int optlen);
 #endif
 };
index 58ede3d..49bf15c 100644 (file)
@@ -3249,7 +3249,8 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
 #ifdef CONFIG_TCP_MD5SIG
        case TCP_MD5SIG:
        case TCP_MD5SIG_EXT:
-               err = tp->af_specific->md5_parse(sk, optname, optval, optlen);
+               err = tp->af_specific->md5_parse(sk, optname,
+                                                USER_SOCKPTR(optval), optlen);
                break;
 #endif
        case TCP_USER_TIMEOUT:
index daa39d3..f891392 100644 (file)
@@ -1195,7 +1195,7 @@ static void tcp_clear_md5_list(struct sock *sk)
 }
 
 static int tcp_v4_parse_md5_keys(struct sock *sk, int optname,
-                                char __user *optval, int optlen)
+                                sockptr_t optval, int optlen)
 {
        struct tcp_md5sig cmd;
        struct sockaddr_in *sin = (struct sockaddr_in *)&cmd.tcpm_addr;
@@ -1206,7 +1206,7 @@ static int tcp_v4_parse_md5_keys(struct sock *sk, int optname,
        if (optlen < sizeof(cmd))
                return -EINVAL;
 
-       if (copy_from_user(&cmd, optval, sizeof(cmd)))
+       if (copy_from_sockptr(&cmd, optval, sizeof(cmd)))
                return -EFAULT;
 
        if (sin->sin_family != AF_INET)
index c34b783..305870a 100644 (file)
@@ -567,7 +567,7 @@ static struct tcp_md5sig_key *tcp_v6_md5_lookup(const struct sock *sk,
 }
 
 static int tcp_v6_parse_md5_keys(struct sock *sk, int optname,
-                                char __user *optval, int optlen)
+                                sockptr_t optval, int optlen)
 {
        struct tcp_md5sig cmd;
        struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&cmd.tcpm_addr;
@@ -577,7 +577,7 @@ static int tcp_v6_parse_md5_keys(struct sock *sk, int optname,
        if (optlen < sizeof(cmd))
                return -EINVAL;
 
-       if (copy_from_user(&cmd, optval, sizeof(cmd)))
+       if (copy_from_sockptr(&cmd, optval, sizeof(cmd)))
                return -EFAULT;
 
        if (sin6->sin6_family != AF_INET6)