lkml.org 
[lkml]   [2022]   [Apr]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 764/913] media: hdpvr: initialize dev->worker at hdpvr_register_videodev
    Date
    From: Dongliang Mu <mudongliangabcd@gmail.com>

    [ Upstream commit 07922937e9a580825f9965c46fd15e23ba5754b6 ]

    hdpvr_register_videodev is responsible to initialize a worker in
    hdpvr_device. However, the worker is only initialized at
    hdpvr_start_streaming other than hdpvr_register_videodev.
    When hdpvr_probe does not initialize its worker, the hdpvr_disconnect
    will encounter one WARN in flush_work.The stack trace is as follows:

    hdpvr_disconnect+0xb8/0xf2 drivers/media/usb/hdpvr/hdpvr-core.c:425
    usb_unbind_interface+0xbf/0x3a0 drivers/usb/core/driver.c:458
    __device_release_driver drivers/base/dd.c:1206 [inline]
    device_release_driver_internal+0x22a/0x230 drivers/base/dd.c:1237
    bus_remove_device+0x108/0x160 drivers/base/bus.c:529
    device_del+0x1fe/0x510 drivers/base/core.c:3592
    usb_disable_device+0xd1/0x1d0 drivers/usb/core/message.c:1419
    usb_disconnect+0x109/0x330 drivers/usb/core/hub.c:2228

    Fix this by moving the initialization of dev->worker to the starting of
    hdpvr_register_videodev

    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: Mauro Carvalho Chehab <mchehab@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/media/usb/hdpvr/hdpvr-video.c | 4 +++-
    1 file changed, 3 insertions(+), 1 deletion(-)

    diff --git a/drivers/media/usb/hdpvr/hdpvr-video.c b/drivers/media/usb/hdpvr/hdpvr-video.c
    index 563128d11731..60e57e0f1927 100644
    --- a/drivers/media/usb/hdpvr/hdpvr-video.c
    +++ b/drivers/media/usb/hdpvr/hdpvr-video.c
    @@ -308,7 +308,6 @@ static int hdpvr_start_streaming(struct hdpvr_device *dev)

    dev->status = STATUS_STREAMING;

    - INIT_WORK(&dev->worker, hdpvr_transmit_buffers);
    schedule_work(&dev->worker);

    v4l2_dbg(MSG_BUFFER, hdpvr_debug, &dev->v4l2_dev,
    @@ -1165,6 +1164,9 @@ int hdpvr_register_videodev(struct hdpvr_device *dev, struct device *parent,
    bool ac3 = dev->flags & HDPVR_FLAG_AC3_CAP;
    int res;

    + // initialize dev->worker
    + INIT_WORK(&dev->worker, hdpvr_transmit_buffers);
    +
    dev->cur_std = V4L2_STD_525_60;
    dev->width = 720;
    dev->height = 480;
    --
    2.34.1


    \
     
     \ /
      Last update: 2022-04-06 06:41    [W:3.335 / U:0.588 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site