From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
To: Rob Clark <robdclark@gmail.com>, dri-devel@lists.freedesktop.org
Cc: "Rob Clark" <robdclark@chromium.org>,
"Thomas Hellström" <thomas.hellstrom@linux.intel.com>,
"open list:INTEL DRM DRIVERS" <intel-gfx@lists.freedesktop.org>,
"open list" <linux-kernel@vger.kernel.org>,
"Chris Wilson" <chris@chris-wilson.co.uk>,
"Daniel Vetter" <daniel@ffwll.ch>,
"Rodrigo Vivi" <rodrigo.vivi@intel.com>,
"David Airlie" <airlied@gmail.com>,
katrinzhou <katrinzhou@tencent.com>
Subject: Re: [Intel-gfx] [PATCH] drm/i915: Fix potential context UAFs
Date: Wed, 4 Jan 2023 09:33:54 +0000 [thread overview]
Message-ID: <04ec647c-184e-942e-a7ed-4ba393e591b7@linux.intel.com> (raw)
In-Reply-To: <20230103234948.1218393-1-robdclark@gmail.com>
On 03/01/2023 23:49, Rob Clark wrote:
> From: Rob Clark <robdclark@chromium.org>
>
> gem_context_register() makes the context visible to userspace, and which
> point a separate thread can trigger the I915_GEM_CONTEXT_DESTROY ioctl.
> So we need to ensure that nothing uses the ctx ptr after this. And we
> need to ensure that adding the ctx to the xarray is the *last* thing
> that gem_context_register() does with the ctx pointer.
Any backtraces from oopses or notes on how it was found to record in the commit message?
> Signed-off-by: Rob Clark <robdclark@chromium.org>
Fixes: a4c1cdd34e2c ("drm/i915/gem: Delay context creation (v3)")
References: 3aa9945a528e ("drm/i915: Separate GEM context construction and registration to userspace")
Cc: <stable@vger.kernel.org> # v5.15+
> ---
> drivers/gpu/drm/i915/gem/i915_gem_context.c | 24 +++++++++++++++------
> 1 file changed, 18 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c b/drivers/gpu/drm/i915/gem/i915_gem_context.c
> index 7f2831efc798..6250de9b9196 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c
> @@ -1688,6 +1688,10 @@ void i915_gem_init__contexts(struct drm_i915_private *i915)
> init_contexts(&i915->gem.contexts);
> }
>
> +/*
> + * Note that this implicitly consumes the ctx reference, by placing
> + * the ctx in the context_xa.
> + */
> static void gem_context_register(struct i915_gem_context *ctx,
> struct drm_i915_file_private *fpriv,
> u32 id)
> @@ -1703,10 +1707,6 @@ static void gem_context_register(struct i915_gem_context *ctx,
> snprintf(ctx->name, sizeof(ctx->name), "%s[%d]",
> current->comm, pid_nr(ctx->pid));
>
> - /* And finally expose ourselves to userspace via the idr */
> - old = xa_store(&fpriv->context_xa, id, ctx, GFP_KERNEL);
> - WARN_ON(old);
> -
> spin_lock(&ctx->client->ctx_lock);
> list_add_tail_rcu(&ctx->client_link, &ctx->client->ctx_list);
> spin_unlock(&ctx->client->ctx_lock);
> @@ -1714,6 +1714,10 @@ static void gem_context_register(struct i915_gem_context *ctx,
> spin_lock(&i915->gem.contexts.lock);
> list_add_tail(&ctx->link, &i915->gem.contexts.list);
> spin_unlock(&i915->gem.contexts.lock);
> +
> + /* And finally expose ourselves to userspace via the idr */
> + old = xa_store(&fpriv->context_xa, id, ctx, GFP_KERNEL);
> + WARN_ON(old);
Have you seen that this hunk is needed or just moving it for a good measure? To be clear, it is probably best to move it even if the current placement cannot cause any problems, I am just double-checking if you had any concrete observations here while mulling over easier stable backports if we would omit it.
> }
>
> int i915_gem_context_open(struct drm_i915_private *i915,
> @@ -2199,14 +2203,22 @@ finalize_create_context_locked(struct drm_i915_file_private *file_priv,
> if (IS_ERR(ctx))
> return ctx;
>
> + /*
> + * One for the xarray and one for the caller. We need to grab
> + * the reference *prior* to making the ctx visble to userspace
> + * in gem_context_register(), as at any point after that
> + * userspace can try to race us with another thread destroying
> + * the context under our feet.
> + */
> + i915_gem_context_get(ctx);
> +
> gem_context_register(ctx, file_priv, id);
>
> old = xa_erase(&file_priv->proto_context_xa, id);
> GEM_BUG_ON(old != pc);
> proto_context_close(file_priv->dev_priv, pc);
>
> - /* One for the xarray and one for the caller */
> - return i915_gem_context_get(ctx);
> + return ctx;
Otherwise userspace can look up a context which hasn't had it's reference count increased yep. I can add the Fixes: and Stable: tags while merging if no complaints.
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Regards,
Tvrtko
> }
>
> struct i915_gem_context *
WARNING: multiple messages have this Message-ID (diff)
From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
To: Rob Clark <robdclark@gmail.com>, dri-devel@lists.freedesktop.org
Cc: "Rob Clark" <robdclark@chromium.org>,
"Matthew Brost" <matthew.brost@intel.com>,
"Andi Shyti" <andi.shyti@linux.intel.com>,
"Thomas Hellström" <thomas.hellstrom@linux.intel.com>,
"open list:INTEL DRM DRIVERS" <intel-gfx@lists.freedesktop.org>,
"open list" <linux-kernel@vger.kernel.org>,
"Chris Wilson" <chris@chris-wilson.co.uk>,
"Rodrigo Vivi" <rodrigo.vivi@intel.com>,
"John Harrison" <John.C.Harrison@Intel.com>,
katrinzhou <katrinzhou@tencent.com>
Subject: Re: [PATCH] drm/i915: Fix potential context UAFs
Date: Wed, 4 Jan 2023 09:33:54 +0000 [thread overview]
Message-ID: <04ec647c-184e-942e-a7ed-4ba393e591b7@linux.intel.com> (raw)
In-Reply-To: <20230103234948.1218393-1-robdclark@gmail.com>
On 03/01/2023 23:49, Rob Clark wrote:
> From: Rob Clark <robdclark@chromium.org>
>
> gem_context_register() makes the context visible to userspace, and which
> point a separate thread can trigger the I915_GEM_CONTEXT_DESTROY ioctl.
> So we need to ensure that nothing uses the ctx ptr after this. And we
> need to ensure that adding the ctx to the xarray is the *last* thing
> that gem_context_register() does with the ctx pointer.
Any backtraces from oopses or notes on how it was found to record in the commit message?
> Signed-off-by: Rob Clark <robdclark@chromium.org>
Fixes: a4c1cdd34e2c ("drm/i915/gem: Delay context creation (v3)")
References: 3aa9945a528e ("drm/i915: Separate GEM context construction and registration to userspace")
Cc: <stable@vger.kernel.org> # v5.15+
> ---
> drivers/gpu/drm/i915/gem/i915_gem_context.c | 24 +++++++++++++++------
> 1 file changed, 18 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c b/drivers/gpu/drm/i915/gem/i915_gem_context.c
> index 7f2831efc798..6250de9b9196 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c
> @@ -1688,6 +1688,10 @@ void i915_gem_init__contexts(struct drm_i915_private *i915)
> init_contexts(&i915->gem.contexts);
> }
>
> +/*
> + * Note that this implicitly consumes the ctx reference, by placing
> + * the ctx in the context_xa.
> + */
> static void gem_context_register(struct i915_gem_context *ctx,
> struct drm_i915_file_private *fpriv,
> u32 id)
> @@ -1703,10 +1707,6 @@ static void gem_context_register(struct i915_gem_context *ctx,
> snprintf(ctx->name, sizeof(ctx->name), "%s[%d]",
> current->comm, pid_nr(ctx->pid));
>
> - /* And finally expose ourselves to userspace via the idr */
> - old = xa_store(&fpriv->context_xa, id, ctx, GFP_KERNEL);
> - WARN_ON(old);
> -
> spin_lock(&ctx->client->ctx_lock);
> list_add_tail_rcu(&ctx->client_link, &ctx->client->ctx_list);
> spin_unlock(&ctx->client->ctx_lock);
> @@ -1714,6 +1714,10 @@ static void gem_context_register(struct i915_gem_context *ctx,
> spin_lock(&i915->gem.contexts.lock);
> list_add_tail(&ctx->link, &i915->gem.contexts.list);
> spin_unlock(&i915->gem.contexts.lock);
> +
> + /* And finally expose ourselves to userspace via the idr */
> + old = xa_store(&fpriv->context_xa, id, ctx, GFP_KERNEL);
> + WARN_ON(old);
Have you seen that this hunk is needed or just moving it for a good measure? To be clear, it is probably best to move it even if the current placement cannot cause any problems, I am just double-checking if you had any concrete observations here while mulling over easier stable backports if we would omit it.
> }
>
> int i915_gem_context_open(struct drm_i915_private *i915,
> @@ -2199,14 +2203,22 @@ finalize_create_context_locked(struct drm_i915_file_private *file_priv,
> if (IS_ERR(ctx))
> return ctx;
>
> + /*
> + * One for the xarray and one for the caller. We need to grab
> + * the reference *prior* to making the ctx visble to userspace
> + * in gem_context_register(), as at any point after that
> + * userspace can try to race us with another thread destroying
> + * the context under our feet.
> + */
> + i915_gem_context_get(ctx);
> +
> gem_context_register(ctx, file_priv, id);
>
> old = xa_erase(&file_priv->proto_context_xa, id);
> GEM_BUG_ON(old != pc);
> proto_context_close(file_priv->dev_priv, pc);
>
> - /* One for the xarray and one for the caller */
> - return i915_gem_context_get(ctx);
> + return ctx;
Otherwise userspace can look up a context which hasn't had it's reference count increased yep. I can add the Fixes: and Stable: tags while merging if no complaints.
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Regards,
Tvrtko
> }
>
> struct i915_gem_context *
WARNING: multiple messages have this Message-ID (diff)
From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
To: Rob Clark <robdclark@gmail.com>, dri-devel@lists.freedesktop.org
Cc: "Rob Clark" <robdclark@chromium.org>,
"Jani Nikula" <jani.nikula@linux.intel.com>,
"Joonas Lahtinen" <joonas.lahtinen@linux.intel.com>,
"Rodrigo Vivi" <rodrigo.vivi@intel.com>,
"David Airlie" <airlied@gmail.com>,
"Daniel Vetter" <daniel@ffwll.ch>,
"Chris Wilson" <chris@chris-wilson.co.uk>,
"Andi Shyti" <andi.shyti@linux.intel.com>,
"John Harrison" <John.C.Harrison@Intel.com>,
"Matthew Brost" <matthew.brost@intel.com>,
katrinzhou <katrinzhou@tencent.com>,
"Thomas Hellström" <thomas.hellstrom@linux.intel.com>,
"open list:INTEL DRM DRIVERS" <intel-gfx@lists.freedesktop.org>,
"open list" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] drm/i915: Fix potential context UAFs
Date: Wed, 4 Jan 2023 09:33:54 +0000 [thread overview]
Message-ID: <04ec647c-184e-942e-a7ed-4ba393e591b7@linux.intel.com> (raw)
In-Reply-To: <20230103234948.1218393-1-robdclark@gmail.com>
On 03/01/2023 23:49, Rob Clark wrote:
> From: Rob Clark <robdclark@chromium.org>
>
> gem_context_register() makes the context visible to userspace, and which
> point a separate thread can trigger the I915_GEM_CONTEXT_DESTROY ioctl.
> So we need to ensure that nothing uses the ctx ptr after this. And we
> need to ensure that adding the ctx to the xarray is the *last* thing
> that gem_context_register() does with the ctx pointer.
Any backtraces from oopses or notes on how it was found to record in the commit message?
> Signed-off-by: Rob Clark <robdclark@chromium.org>
Fixes: a4c1cdd34e2c ("drm/i915/gem: Delay context creation (v3)")
References: 3aa9945a528e ("drm/i915: Separate GEM context construction and registration to userspace")
Cc: <stable@vger.kernel.org> # v5.15+
> ---
> drivers/gpu/drm/i915/gem/i915_gem_context.c | 24 +++++++++++++++------
> 1 file changed, 18 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c b/drivers/gpu/drm/i915/gem/i915_gem_context.c
> index 7f2831efc798..6250de9b9196 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c
> @@ -1688,6 +1688,10 @@ void i915_gem_init__contexts(struct drm_i915_private *i915)
> init_contexts(&i915->gem.contexts);
> }
>
> +/*
> + * Note that this implicitly consumes the ctx reference, by placing
> + * the ctx in the context_xa.
> + */
> static void gem_context_register(struct i915_gem_context *ctx,
> struct drm_i915_file_private *fpriv,
> u32 id)
> @@ -1703,10 +1707,6 @@ static void gem_context_register(struct i915_gem_context *ctx,
> snprintf(ctx->name, sizeof(ctx->name), "%s[%d]",
> current->comm, pid_nr(ctx->pid));
>
> - /* And finally expose ourselves to userspace via the idr */
> - old = xa_store(&fpriv->context_xa, id, ctx, GFP_KERNEL);
> - WARN_ON(old);
> -
> spin_lock(&ctx->client->ctx_lock);
> list_add_tail_rcu(&ctx->client_link, &ctx->client->ctx_list);
> spin_unlock(&ctx->client->ctx_lock);
> @@ -1714,6 +1714,10 @@ static void gem_context_register(struct i915_gem_context *ctx,
> spin_lock(&i915->gem.contexts.lock);
> list_add_tail(&ctx->link, &i915->gem.contexts.list);
> spin_unlock(&i915->gem.contexts.lock);
> +
> + /* And finally expose ourselves to userspace via the idr */
> + old = xa_store(&fpriv->context_xa, id, ctx, GFP_KERNEL);
> + WARN_ON(old);
Have you seen that this hunk is needed or just moving it for a good measure? To be clear, it is probably best to move it even if the current placement cannot cause any problems, I am just double-checking if you had any concrete observations here while mulling over easier stable backports if we would omit it.
> }
>
> int i915_gem_context_open(struct drm_i915_private *i915,
> @@ -2199,14 +2203,22 @@ finalize_create_context_locked(struct drm_i915_file_private *file_priv,
> if (IS_ERR(ctx))
> return ctx;
>
> + /*
> + * One for the xarray and one for the caller. We need to grab
> + * the reference *prior* to making the ctx visble to userspace
> + * in gem_context_register(), as at any point after that
> + * userspace can try to race us with another thread destroying
> + * the context under our feet.
> + */
> + i915_gem_context_get(ctx);
> +
> gem_context_register(ctx, file_priv, id);
>
> old = xa_erase(&file_priv->proto_context_xa, id);
> GEM_BUG_ON(old != pc);
> proto_context_close(file_priv->dev_priv, pc);
>
> - /* One for the xarray and one for the caller */
> - return i915_gem_context_get(ctx);
> + return ctx;
Otherwise userspace can look up a context which hasn't had it's reference count increased yep. I can add the Fixes: and Stable: tags while merging if no complaints.
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Regards,
Tvrtko
> }
>
> struct i915_gem_context *
next prev parent reply other threads:[~2023-01-04 9:34 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-03 23:49 [Intel-gfx] [PATCH] drm/i915: Fix potential context UAFs Rob Clark
2023-01-03 23:49 ` Rob Clark
2023-01-03 23:49 ` Rob Clark
2023-01-04 9:33 ` Tvrtko Ursulin [this message]
2023-01-04 9:33 ` Tvrtko Ursulin
2023-01-04 9:33 ` Tvrtko Ursulin
2023-01-04 16:01 ` [Intel-gfx] " Rob Clark
2023-01-04 16:01 ` Rob Clark
2023-01-04 16:01 ` Rob Clark
2023-01-04 13:41 ` [Intel-gfx] ✗ Fi.CI.BAT: failure for " Patchwork
2023-01-05 12:33 ` [Intel-gfx] ✓ Fi.CI.BAT: success for drm/i915: Fix potential context UAFs (rev2) Patchwork
2023-01-05 15:52 ` [Intel-gfx] [PATCH] drm/i915: Fix potential context UAFs Andi Shyti
2023-01-05 15:52 ` Andi Shyti
2023-01-05 15:52 ` Andi Shyti
2023-01-05 16:00 ` [Intel-gfx] " Tvrtko Ursulin
2023-01-05 16:00 ` Tvrtko Ursulin
2023-01-05 16:00 ` Tvrtko Ursulin
2023-01-06 10:15 ` [Intel-gfx] " Tvrtko Ursulin
2023-01-06 10:15 ` Tvrtko Ursulin
2023-01-06 10:15 ` Tvrtko Ursulin
2023-01-06 9:34 ` [Intel-gfx] ✓ Fi.CI.IGT: success for drm/i915: Fix potential context UAFs (rev2) Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=04ec647c-184e-942e-a7ed-4ba393e591b7@linux.intel.com \
--to=tvrtko.ursulin@linux.intel.com \
--cc=airlied@gmail.com \
--cc=chris@chris-wilson.co.uk \
--cc=daniel@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=intel-gfx@lists.freedesktop.org \
--cc=katrinzhou@tencent.com \
--cc=linux-kernel@vger.kernel.org \
--cc=robdclark@chromium.org \
--cc=robdclark@gmail.com \
--cc=rodrigo.vivi@intel.com \
--cc=thomas.hellstrom@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.