]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
io_uring/bpf_filters: retain COW'ed settings on parse failures
authorJens Axboe <axboe@kernel.dk>
Tue, 31 Mar 2026 14:16:58 +0000 (08:16 -0600)
committerJens Axboe <axboe@kernel.dk>
Wed, 1 Apr 2026 14:34:14 +0000 (08:34 -0600)
If io_parse_restrictions() fails, it ends up clearing any restrictions
currently set. The intent is only to clear whatever it already applied,
but it ends up clearing everything, including whatever settings may have
been applied in a copy-on-write fashion already. Ensure that those are
retained.

Link: https://lore.kernel.org/io-uring/CAK8a0jzF-zaO5ZmdOrmfuxrhXuKg5m5+RDuO7tNvtj=kUYbW7Q@mail.gmail.com/
Reported-by: antonius <bluedragonsec2023@gmail.com>
Fixes: ed82f35b926b ("io_uring: allow registration of per-task restrictions")
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/register.c

index 5f3eb018fb3285c268beb7c311291de24928adfb..837324bf0223357242aff40b5190ea22376dd5f7 100644 (file)
@@ -178,9 +178,17 @@ static __cold int io_register_restrictions(struct io_ring_ctx *ctx,
                return -EBUSY;
 
        ret = io_parse_restrictions(arg, nr_args, &ctx->restrictions);
-       /* Reset all restrictions if an error happened */
+       /*
+        * Reset all restrictions if an error happened, but retain any COW'ed
+        * settings.
+        */
        if (ret < 0) {
+               struct io_bpf_filters *bpf = ctx->restrictions.bpf_filters;
+               bool cowed = ctx->restrictions.bpf_filters_cow;
+
                memset(&ctx->restrictions, 0, sizeof(ctx->restrictions));
+               ctx->restrictions.bpf_filters = bpf;
+               ctx->restrictions.bpf_filters_cow = cowed;
                return ret;
        }
        if (ctx->restrictions.op_registered)