]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - net/sctp/socket.c
unexport sock_map_fd(), switch to sock_alloc_file()
[mirror_ubuntu-bionic-kernel.git] / net / sctp / socket.c
index 5e259817a7f34cd4a183139fe9c4bf5ee2ab6689..fb5931ca50d0fc4aad0ac49d60b7591d981ea30f 100644 (file)
@@ -70,6 +70,7 @@
 #include <linux/init.h>
 #include <linux/crypto.h>
 #include <linux/slab.h>
+#include <linux/file.h>
 
 #include <net/ip.h>
 #include <net/icmp.h>
@@ -4276,6 +4277,7 @@ static int sctp_getsockopt_peeloff(struct sock *sk, int len, char __user *optval
 {
        sctp_peeloff_arg_t peeloff;
        struct socket *newsock;
+       struct file *newfile;
        int retval = 0;
 
        if (len < sizeof(sctp_peeloff_arg_t))
@@ -4289,22 +4291,35 @@ static int sctp_getsockopt_peeloff(struct sock *sk, int len, char __user *optval
                goto out;
 
        /* Map the socket to an unused fd that can be returned to the user.  */
-       retval = sock_map_fd(newsock, 0);
+       retval = get_unused_fd();
        if (retval < 0) {
                sock_release(newsock);
                goto out;
        }
 
+       newfile = sock_alloc_file(newsock, 0);
+       if (unlikely(IS_ERR(newfile))) {
+               put_unused_fd(retval);
+               sock_release(newsock);
+               return PTR_ERR(newfile);
+       }
+
        SCTP_DEBUG_PRINTK("%s: sk: %p newsk: %p sd: %d\n",
                          __func__, sk, newsock->sk, retval);
 
        /* Return the fd mapped to the new socket.  */
+       if (put_user(len, optlen)) {
+               fput(newfile);
+               put_unused_fd(retval);
+               return -EFAULT;
+       }
        peeloff.sd = retval;
-       if (put_user(len, optlen))
+       if (copy_to_user(optval, &peeloff, len)) {
+               fput(newfile);
+               put_unused_fd(retval);
                return -EFAULT;
-       if (copy_to_user(optval, &peeloff, len))
-               retval = -EFAULT;
-
+       }
+       fd_install(retval, newfile);
 out:
        return retval;
 }