All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sean Young <sean@mess.org>
To: Robert Foss <robert.foss@linaro.org>
Cc: Takashi Iwai <tiwai@suse.de>,
	Mauro Carvalho Chehab <mchehab@kernel.org>,
	linux-media <linux-media@vger.kernel.org>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	Stefan Seyfried <seife+kernel@b1-systems.com>
Subject: Re: [PATCH 2/2] media: dvb-usb: Fix use-after-free access
Date: Sun, 31 Jan 2021 15:04:56 +0000	[thread overview]
Message-ID: <20210131150456.GB4886@gofer.mess.org> (raw)
In-Reply-To: <CAG3jFyuTJ5sj_YYYfFO0LAFN-RM4QdmLV7w4ng9pb9eJkO4FiQ@mail.gmail.com>

Hi Takashi,

On Fri, Jan 22, 2021 at 04:47:44PM +0100, Robert Foss wrote:
> Hey Takashi,
> 
> This patch is generating a checkpatch warning, but I think it is
> spurious and can be ignored.

The checkpatch warning isn't superious and should really be corrected.

> 
> Other than that, this looks good to me.
> Reviewed-by: Robert Foss <robert.foss@linaro.org>
> 
> On Wed, 20 Jan 2021 at 12:51, Takashi Iwai <tiwai@suse.de> wrote:
> >
> > dvb_usb_device_init() copies the properties to the own data, so that
> > the callers can release the original properties later (as done in the
> > commit 299c7007e936 "media: dw2102: Fix memleak on sequence of
> > probes").  However, it also stores dev->desc pointer that is a
> > reference to the original properties data.  Since dev->desc is
> > referred later, it may result in use-after-free, in the worst case,
> > leading to a kernel Oops as reported.
> >
> > This patch addresses the problem by allocating and copying the
> > properties at first, then get the desc from the copied properties.
> >
> > Reported-and-tested-by: Stefan Seyfried <seife+kernel@b1-systems.com>
> > BugLink: http://bugzilla.opensuse.org/show_bug.cgi?id=1181104
> > Cc: <stable@vger.kernel.org>
> > Signed-off-by: Takashi Iwai <tiwai@suse.de>

Thank you for your patch. Unfortunately, it depends on the first patch
in the series, which I think has problems (see email about this).

Thanks

Sean


> > ---
> >  drivers/media/usb/dvb-usb/dvb-usb-init.c | 23 +++++++++++++----------
> >  1 file changed, 13 insertions(+), 10 deletions(-)
> >
> > diff --git a/drivers/media/usb/dvb-usb/dvb-usb-init.c b/drivers/media/usb/dvb-usb/dvb-usb-init.c
> > index 5befec87f26a..07ff9b4d2f34 100644
> > --- a/drivers/media/usb/dvb-usb/dvb-usb-init.c
> > +++ b/drivers/media/usb/dvb-usb/dvb-usb-init.c
> > @@ -255,27 +255,30 @@ int dvb_usb_device_init(struct usb_interface *intf,
> >         if (du != NULL)
> >                 *du = NULL;
> >
> > -       if ((desc = dvb_usb_find_device(udev, props, &cold)) == NULL) {
> > +       d = kzalloc(sizeof(struct dvb_usb_device), GFP_KERNEL);
> > +       if (!d) {
> > +               err("no memory for 'struct dvb_usb_device'");
> > +               return -ENOMEM;
> > +       }
> > +
> > +       memcpy(&d->props, props, sizeof(struct dvb_usb_device_properties));
> > +
> > +       desc = dvb_usb_find_device(udev, &d->props, &cold);
> > +       if (!desc) {
> >                 deb_err("something went very wrong, device was not found in current device list - let's see what comes next.\n");
> > -               return -ENODEV;
> > +               ret = -ENODEV;
> > +               goto error;
> >         }
> >
> >         if (cold) {
> >                 info("found a '%s' in cold state, will try to load a firmware", desc->name);
> >                 ret = dvb_usb_download_firmware(udev, props);
> >                 if (!props->no_reconnect || ret != 0)
> > -                       return ret;
> > +                       goto error;
> >         }
> >
> >         info("found a '%s' in warm state.", desc->name);
> > -       d = kzalloc(sizeof(struct dvb_usb_device), GFP_KERNEL);
> > -       if (d == NULL) {
> > -               err("no memory for 'struct dvb_usb_device'");
> > -               return -ENOMEM;
> > -       }
> > -
> >         d->udev = udev;
> > -       memcpy(&d->props, props, sizeof(struct dvb_usb_device_properties));
> >         d->desc = desc;
> >         d->owner = owner;
> >
> > --
> > 2.26.2
> >

  reply	other threads:[~2021-01-31 15:14 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-20 10:20 [PATCH 0/2] media: dvb-usb: Fix UAF and memory leaks Takashi Iwai
2021-01-20 10:20 ` [PATCH 1/2] media: dvb-usb: Fix memory leak at error in dvb_usb_device_init() Takashi Iwai
2021-01-22  9:24   ` Robert Foss
2021-01-31 14:53   ` Sean Young
2021-02-01  8:18     ` Takashi Iwai
2021-01-20 10:20 ` [PATCH 2/2] media: dvb-usb: Fix use-after-free access Takashi Iwai
2021-01-22 15:47   ` Robert Foss
2021-01-31 15:04     ` Sean Young [this message]
2021-02-01  8:22       ` Takashi Iwai

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=20210131150456.GB4886@gofer.mess.org \
    --to=sean@mess.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=mchehab@kernel.org \
    --cc=robert.foss@linaro.org \
    --cc=seife+kernel@b1-systems.com \
    --cc=tiwai@suse.de \
    /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.