net/tcp: switch ->md5_parse to sockptr_t
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>
This commit is contained in:

committed by
David S. Miller

parent
91ac1ccaff
commit
d4c19c4914
@@ -2002,7 +2002,7 @@ struct tcp_sock_af_ops {
|
|||||||
const struct sk_buff *skb);
|
const struct sk_buff *skb);
|
||||||
int (*md5_parse)(struct sock *sk,
|
int (*md5_parse)(struct sock *sk,
|
||||||
int optname,
|
int optname,
|
||||||
char __user *optval,
|
sockptr_t optval,
|
||||||
int optlen);
|
int optlen);
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
@@ -3249,7 +3249,8 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
|
|||||||
#ifdef CONFIG_TCP_MD5SIG
|
#ifdef CONFIG_TCP_MD5SIG
|
||||||
case TCP_MD5SIG:
|
case TCP_MD5SIG:
|
||||||
case TCP_MD5SIG_EXT:
|
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;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case TCP_USER_TIMEOUT:
|
case TCP_USER_TIMEOUT:
|
||||||
|
@@ -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,
|
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 tcp_md5sig cmd;
|
||||||
struct sockaddr_in *sin = (struct sockaddr_in *)&cmd.tcpm_addr;
|
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))
|
if (optlen < sizeof(cmd))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (copy_from_user(&cmd, optval, sizeof(cmd)))
|
if (copy_from_sockptr(&cmd, optval, sizeof(cmd)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
if (sin->sin_family != AF_INET)
|
if (sin->sin_family != AF_INET)
|
||||||
|
@@ -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,
|
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 tcp_md5sig cmd;
|
||||||
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&cmd.tcpm_addr;
|
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))
|
if (optlen < sizeof(cmd))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (copy_from_user(&cmd, optval, sizeof(cmd)))
|
if (copy_from_sockptr(&cmd, optval, sizeof(cmd)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
if (sin6->sin6_family != AF_INET6)
|
if (sin6->sin6_family != AF_INET6)
|
||||||
|
Reference in New Issue
Block a user