net: switch sock_set_timeout to sockptr_t
authorChristoph Hellwig <hch@lst.de>
Thu, 23 Jul 2020 06:08:49 +0000 (08:08 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 24 Jul 2020 22:41:53 +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>
net/core/sock.c

index 5b55bc9397f2826eb2f934ff7ec2996d18dbdb9c..8b9eddaff868a5c27c54c0226bc474f5bbdad062 100644 (file)
@@ -361,7 +361,8 @@ static int sock_get_timeout(long timeo, void *optval, bool old_timeval)
        return sizeof(tv);
 }
 
-static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen, bool old_timeval)
+static int sock_set_timeout(long *timeo_p, sockptr_t optval, int optlen,
+                           bool old_timeval)
 {
        struct __kernel_sock_timeval tv;
 
@@ -371,7 +372,7 @@ static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen, bool
                if (optlen < sizeof(tv32))
                        return -EINVAL;
 
-               if (copy_from_user(&tv32, optval, sizeof(tv32)))
+               if (copy_from_sockptr(&tv32, optval, sizeof(tv32)))
                        return -EFAULT;
                tv.tv_sec = tv32.tv_sec;
                tv.tv_usec = tv32.tv_usec;
@@ -380,14 +381,14 @@ static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen, bool
 
                if (optlen < sizeof(old_tv))
                        return -EINVAL;
-               if (copy_from_user(&old_tv, optval, sizeof(old_tv)))
+               if (copy_from_sockptr(&old_tv, optval, sizeof(old_tv)))
                        return -EFAULT;
                tv.tv_sec = old_tv.tv_sec;
                tv.tv_usec = old_tv.tv_usec;
        } else {
                if (optlen < sizeof(tv))
                        return -EINVAL;
-               if (copy_from_user(&tv, optval, sizeof(tv)))
+               if (copy_from_sockptr(&tv, optval, sizeof(tv)))
                        return -EFAULT;
        }
        if (tv.tv_usec < 0 || tv.tv_usec >= USEC_PER_SEC)
@@ -1051,12 +1052,14 @@ set_sndbuf:
 
        case SO_RCVTIMEO_OLD:
        case SO_RCVTIMEO_NEW:
-               ret = sock_set_timeout(&sk->sk_rcvtimeo, optval, optlen, optname == SO_RCVTIMEO_OLD);
+               ret = sock_set_timeout(&sk->sk_rcvtimeo, USER_SOCKPTR(optval),
+                                      optlen, optname == SO_RCVTIMEO_OLD);
                break;
 
        case SO_SNDTIMEO_OLD:
        case SO_SNDTIMEO_NEW:
-               ret = sock_set_timeout(&sk->sk_sndtimeo, optval, optlen, optname == SO_SNDTIMEO_OLD);
+               ret = sock_set_timeout(&sk->sk_sndtimeo, USER_SOCKPTR(optval),
+                                      optlen, optname == SO_SNDTIMEO_OLD);
                break;
 
        case SO_ATTACH_FILTER: {