drm/vc4: kms: Add functions to create the state objects
[platform/kernel/linux-rpi.git] / fs / userfaultfd.c
index f9fd186..d99d166 100644 (file)
@@ -1834,13 +1834,12 @@ static int userfaultfd_api(struct userfaultfd_ctx *ctx,
        if (copy_from_user(&uffdio_api, buf, sizeof(uffdio_api)))
                goto out;
        features = uffdio_api.features;
-       if (uffdio_api.api != UFFD_API || (features & ~UFFD_API_FEATURES)) {
-               memset(&uffdio_api, 0, sizeof(uffdio_api));
-               if (copy_to_user(buf, &uffdio_api, sizeof(uffdio_api)))
-                       goto out;
-               ret = -EINVAL;
-               goto out;
-       }
+       ret = -EINVAL;
+       if (uffdio_api.api != UFFD_API || (features & ~UFFD_API_FEATURES))
+               goto err_out;
+       ret = -EPERM;
+       if ((features & UFFD_FEATURE_EVENT_FORK) && !capable(CAP_SYS_PTRACE))
+               goto err_out;
        /* report all available features and ioctls to userland */
        uffdio_api.features = UFFD_API_FEATURES;
        uffdio_api.ioctls = UFFD_API_IOCTLS;
@@ -1853,6 +1852,11 @@ static int userfaultfd_api(struct userfaultfd_ctx *ctx,
        ret = 0;
 out:
        return ret;
+err_out:
+       memset(&uffdio_api, 0, sizeof(uffdio_api));
+       if (copy_to_user(buf, &uffdio_api, sizeof(uffdio_api)))
+               ret = -EFAULT;
+       goto out;
 }
 
 static long userfaultfd_ioctl(struct file *file, unsigned cmd,