[Intel-xe] [PATCH 1/2 v2] drm/xe: fix bounds checking for 'len' in xe_engine_create_ioctl
Zanoni, Paulo R
paulo.r.zanoni at intel.com
Tue Jun 27 21:24:13 UTC 2023
On Tue, 2023-06-27 at 16:10 -0300, Lucas De Marchi wrote:
> On Mon, Jun 26, 2023 at 02:22:20PM -0700, Paulo Zanoni wrote:
> > There's this shared machine running xe.ko and I often log in to see my
> > tmux corrupted by messages such as:
> >
> > usercopy: Kernel memory overwrite attempt detected to wrapped address (offset 0, size 18446660151965198754)!
> >
> > I also sometimes see:
> >
> > kernel BUG at mm/usercopy.c:102!
> >
> > Someone is running a program that's definitely submitting random
> > numbers to this ioctl. If you pass width=65535 and
> > num_placements=32769 then you get a negative 'len', which avoids the
> > EINVAL check, leading to the bug.
> >
> > Switch 'len' to u32. It is the result of the multiplication of two u16
> > numbers, so it won't be able to overflow back into smaller numbers as
> > an u32.
> >
> > Very simple reproducer:
> > https://people.freedesktop.org/~pzanoni/engine-create-bug/
>
> since this will be forever in the git log, maybe instead of a link that
> may vanish just add something like this in the commit message itself?
Well, my git log references to people.freedesktop.org have lasted
longer than my git log references to bugzilla.freedesktop.org :)
To be fair the bugs are so simple that we could also just remove the
links, so I'm fine with any of the 3 possible approaches: (a) keep it
as-is; (b) paste code as you suggested or (c) completely remove the
mention to the reproducer.
I don't think I have permission to merge this, so whoever gets to merge
this can choose the appropriate way to mend the commit messages. Or do
I need to resend the series to the list?
Thanks,
Paulo
>
> fd_ = ...;
> vm_id_ = ...;
> instance = ...;
> struct drm_xe_engine_create engine_create = {
> .extensions = (uintptr_t) nullptr,
> .width = 65535,
> .num_placements = 32769,
> .vm_id = vm_id_,
> .flags = 0,
> .engine_id = 0,
> .instances = (uintptr_t) &instance,
> };
> rc = drmIoctl(fd_, DRM_IOCTL_XE_ENGINE_CREATE, &engine_create);
> assert(rc == 0);
>
> >
> > v2: Make len u32 instead of checking for <=0 (José).
> >
> > Signed-off-by: Paulo Zanoni <paulo.r.zanoni at intel.com>
>
>
> Reviewed-by: Lucas De Marchi <lucas.demarchi at intel.com>
>
> Lucas De Marchi
>
> > ---
> > drivers/gpu/drm/xe/xe_engine.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/drivers/gpu/drm/xe/xe_engine.c b/drivers/gpu/drm/xe/xe_engine.c
> > index 6e6b2913f766..530f55a33b03 100644
> > --- a/drivers/gpu/drm/xe/xe_engine.c
> > +++ b/drivers/gpu/drm/xe/xe_engine.c
> > @@ -522,7 +522,7 @@ int xe_engine_create_ioctl(struct drm_device *dev, void *data,
> > struct xe_engine *e = NULL;
> > u32 logical_mask;
> > u32 id;
> > - int len;
> > + u32 len;
> > int err;
> >
> > if (XE_IOCTL_ERR(xe, args->flags) ||
> > --
> > 2.39.2
> >
More information about the Intel-xe
mailing list