lkml.org 
[lkml]   [2022]   [Apr]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 127/475] media: em28xx: initialize refcount before kref_get
    Date
    From: Dongliang Mu <mudongliangabcd@gmail.com>

    [ Upstream commit c08eadca1bdfa099e20a32f8fa4b52b2f672236d ]

    The commit 47677e51e2a4("[media] em28xx: Only deallocate struct
    em28xx after finishing all extensions") adds kref_get to many init
    functions (e.g., em28xx_audio_init). However, kref_init is called too
    late in em28xx_usb_probe, since em28xx_init_dev before will invoke
    those init functions and call kref_get function. Then refcount bug
    occurs in my local syzkaller instance.

    Fix it by moving kref_init before em28xx_init_dev. This issue occurs
    not only in dev but also dev->dev_next.

    Fixes: 47677e51e2a4 ("[media] em28xx: Only deallocate struct em28xx after finishing all extensions")
    Reported-by: syzkaller <syzkaller@googlegroups.com>
    Signed-off-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/media/usb/em28xx/em28xx-cards.c | 8 ++++----
    1 file changed, 4 insertions(+), 4 deletions(-)

    diff --git a/drivers/media/usb/em28xx/em28xx-cards.c b/drivers/media/usb/em28xx/em28xx-cards.c
    index bfca9d0a1fe1..885ccb840ab0 100644
    --- a/drivers/media/usb/em28xx/em28xx-cards.c
    +++ b/drivers/media/usb/em28xx/em28xx-cards.c
    @@ -3821,6 +3821,8 @@ static int em28xx_usb_probe(struct usb_interface *intf,
    goto err_free;
    }

    + kref_init(&dev->ref);
    +
    dev->devno = nr;
    dev->model = id->driver_info;
    dev->alt = -1;
    @@ -3921,6 +3923,8 @@ static int em28xx_usb_probe(struct usb_interface *intf,
    }

    if (dev->board.has_dual_ts && em28xx_duplicate_dev(dev) == 0) {
    + kref_init(&dev->dev_next->ref);
    +
    dev->dev_next->ts = SECONDARY_TS;
    dev->dev_next->alt = -1;
    dev->dev_next->is_audio_only = has_vendor_audio &&
    @@ -3975,12 +3979,8 @@ static int em28xx_usb_probe(struct usb_interface *intf,
    em28xx_write_reg(dev, 0x0b, 0x82);
    mdelay(100);
    }
    -
    - kref_init(&dev->dev_next->ref);
    }

    - kref_init(&dev->ref);
    -
    request_modules(dev);

    /*
    --
    2.34.1


    \
     
     \ /
      Last update: 2022-04-14 16:23    [W:4.280 / U:0.112 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site