All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pavel Skripkin <paskripkin@gmail.com>
To: Hans Verkuil <hverkuil@xs4all.nl>
Cc: mchehab@kernel.org, linux-media@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	syzbot+a6969ef522a36d3344c9@syzkaller.appspotmail.com
Subject: Re: [PATCH] media: em28xx: fix corrupted list
Date: Wed, 21 Jul 2021 15:21:54 +0300	[thread overview]
Message-ID: <20210721152154.6b1a4e68@gmail.com> (raw)
In-Reply-To: <c6bb9cd0-2a8d-99c3-a14d-51c6364ba92d@xs4all.nl>

On Tue, 20 Jul 2021 14:13:13 +0200
Hans Verkuil <hverkuil@xs4all.nl> wrote:

> On 06/07/2021 16:50, Pavel Skripkin wrote:
> > Syzbot reported corrupted list in em28xx driver. The problem was in
> > non-reinitialized lists on disconnect. Since all 2 lists are global
> > variables and driver can be connected and disconnected many times we
> > should call INIT_LIST_HEAD() in .disconnect method to prevent
> > corrupted list entries.
> > 
> > Fixes: 1a23f81b7dc3 ("V4L/DVB (9979): em28xx: move usb probe code
> > to a proper place") Reported-by:
> > syzbot+a6969ef522a36d3344c9@syzkaller.appspotmail.com
> > Signed-off-by: Pavel Skripkin <paskripkin@gmail.com> ---
> >  drivers/media/usb/em28xx/em28xx-cards.c | 2 ++
> >  drivers/media/usb/em28xx/em28xx-core.c  | 6 ++++++
> >  drivers/media/usb/em28xx/em28xx.h       | 1 +
> >  3 files changed, 9 insertions(+)
> > 
> > diff --git a/drivers/media/usb/em28xx/em28xx-cards.c
> > b/drivers/media/usb/em28xx/em28xx-cards.c index
> > ba9292e2a587..8b1ff79c37a0 100644 ---
> > a/drivers/media/usb/em28xx/em28xx-cards.c +++
> > b/drivers/media/usb/em28xx/em28xx-cards.c @@ -4148,6 +4148,8 @@
> > static void em28xx_usb_disconnect(struct usb_interface *intf)
> > dev->dev_next = NULL; }
> >  	kref_put(&dev->ref, em28xx_free_device);
> > +
> > +	em28xx_reset_lists();
> >  }
> >  
> >  static int em28xx_usb_suspend(struct usb_interface *intf,
> > diff --git a/drivers/media/usb/em28xx/em28xx-core.c
> > b/drivers/media/usb/em28xx/em28xx-core.c index
> > 584fa400cd7d..03970ed00dba 100644 ---
> > a/drivers/media/usb/em28xx/em28xx-core.c +++
> > b/drivers/media/usb/em28xx/em28xx-core.c @@ -1131,6 +1131,12 @@
> > void em28xx_init_extension(struct em28xx *dev)
> > mutex_unlock(&em28xx_devlist_mutex); }
> >  
> > +void em28xx_reset_lists(void)
> > +{
> > +	INIT_LIST_HEAD(&em28xx_devlist);
> > +	INIT_LIST_HEAD(&em28xx_extension_devlist);
> 
> This needs a mutex_lock(&em28xx_devlist_mutex);
> 
> But actually, I don't think this is right: if there are multiple
> em28xx devices, then I think if you disconnect one, then the other is
> - with this code - also removed from the list.
> 
> Can you give a link to the actual syzbot bug? I'm not at all sure you
> are fixing the right thing here.

Hi, Hans!

I guess, I missed my coffee that morning, sorry :) This patch looks
complety wrong, of course.

I've took a close look at this bug one more time, and I found the true
root case of this bug.

If em28xx dev has dev_next pointer we need to close dev->next extension
on disconnect to avoid UAF and corrupted list bug. So, something like
this should work:

diff --git a/drivers/media/usb/em28xx/em28xx-cards.c b/drivers/media/usb/em28xx/em28xx-cards.c
index c1e0dccb7408..d56b040e1bd7 100644
--- a/drivers/media/usb/em28xx/em28xx-cards.c
+++ b/drivers/media/usb/em28xx/em28xx-cards.c
@@ -4139,8 +4139,10 @@ static void em28xx_usb_disconnect(struct usb_interface *intf)
 
 	em28xx_close_extension(dev);
 
-	if (dev->dev_next)
+	if (dev->dev_next) {
 		em28xx_release_resources(dev->dev_next);
+		em28xx_close_extension(dev->dev_next);
+	}
 	em28xx_release_resources(dev);
 
 	if (dev->dev_next) {

How to You feel about it? I am going to send this patch for syzbot
testing


Syzbot link:
https://syzkaller.appspot.com/bug?id=3609bbf45bf63a8f6032f330eb3d34f51cc81493


Again, sorry for v1 patch, I don't know how I came up with this fix :(
 


With regards,
Pavel Skripkin

  reply	other threads:[~2021-07-21 12:22 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-06 14:50 [PATCH] media: em28xx: fix corrupted list Pavel Skripkin
2021-07-20 12:13 ` Hans Verkuil
2021-07-21 12:21   ` Pavel Skripkin [this message]
2021-07-21 12:25     ` Hans Verkuil
2021-07-21 19:43       ` [PATCH v2] media: em28xx: add missing em28xx_close_extension Pavel Skripkin
2021-07-29  9:45         ` Hans Verkuil
2021-07-29 12:45           ` Pavel Skripkin
2021-07-29 13:40             ` Hans Verkuil
2021-07-29 20:23               ` [PATCH v3] " Pavel Skripkin

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=20210721152154.6b1a4e68@gmail.com \
    --to=paskripkin@gmail.com \
    --cc=hverkuil@xs4all.nl \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=mchehab@kernel.org \
    --cc=syzbot+a6969ef522a36d3344c9@syzkaller.appspotmail.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.