History

userfaultfd: non-cooperative: report all available features to userland

This will allow userland to probe all features available in the kernel. It will however only enable the requested features in the open userfaultfd context.

Andrea Arcangeli committed 9 years ago

Commit 65603141 parent 9cd75c31 file · +7 −4Browse files

Unified · Split

fs/userfaultfd.c+7−4
@@ -1285,6 +1285,7 @@ static int userfaultfd_api(struct userfaultfd_ctx *ctx, · 1284 unmodified lines
12851285 struct uffdio_api uffdio_api;
12861286 void __user *buf = (void __user *)arg;
12871287 int ret;
1288+ __u64 features;
12881289
12891290 ret = -EINVAL;
12901291 if (ctx->state != UFFD_STATE_WAIT_API)
@@ -1292,21 +1293,23 @@ static int userfaultfd_api(struct userfaultfd_ctx *ctx, · 1 unmodified line
12921293 ret = -EFAULT;
12931294 if (copy_from_user(&uffdio_api, buf, sizeof(uffdio_api)))
12941295 goto out;
1295− if (uffdio_api.api != UFFD_API ||
1296− (uffdio_api.features & ~UFFD_API_FEATURES)) {
1296+ features = uffdio_api.features;
1297+ if (uffdio_api.api != UFFD_API || (features & ~UFFD_API_FEATURES)) {
12971298 memset(&uffdio_api, 0, sizeof(uffdio_api));
12981299 if (copy_to_user(buf, &uffdio_api, sizeof(uffdio_api)))
12991300 goto out;
13001301 ret = -EINVAL;
13011302 goto out;
13021303 }
1303− uffdio_api.features &= UFFD_API_FEATURES;
1304+ /* report all available features and ioctls to userland */
1305+ uffdio_api.features = UFFD_API_FEATURES;
13041306 uffdio_api.ioctls = UFFD_API_IOCTLS;
13051307 ret = -EFAULT;
13061308 if (copy_to_user(buf, &uffdio_api, sizeof(uffdio_api)))
13071309 goto out;
13081310 ctx->state = UFFD_STATE_RUNNING;
1309− ctx->features = uffd_ctx_features(uffdio_api.features);
1311+ /* only enable the requested features for this uffd context */
1312+ ctx->features = uffd_ctx_features(features);
13101313 ret = 0;
13111314 out:
13121315 return ret;