Re: 'LITE-ON USB2.0 DVB-T Tune' driver crash with kernel 4.13 / ubuntu 17.10

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Sean,

I found the problem. The read buffer needs to be allocated with kmalloc too.

int dibusb_read_eeprom_byte(struct dvb_usb_device *d, u8 offs, u8 *val)
{
          u8 *wbuf;
          u8 *rbuf;
          int rc;

          rbuf = kmalloc(1, GFP_KERNEL);
          if (!rbuf)
            return -ENOMEM;

          wbuf = kmalloc(1, GFP_KERNEL);
          if (!wbuf)
            return -ENOMEM;

         *wbuf = offs;

         rc = dibusb_i2c_msg(d, 0x50, wbuf, 1, rbuf, 1);
         kfree(wbuf);
         *val = *rbuf;
         kfree(rbuf);

        return rc;
}

It works now.
Please update the code in the main branch for futur versions.
Thanks.
Regards,
Laurent

2017-10-29 20:31 GMT+01:00 Sean Young <sean@xxxxxxxx>:
> On Sun, Oct 29, 2017 at 06:54:28PM +0100, Laurent Caumont wrote:
>> Hi Sean,
>>
>> I recompiled the modules by following the
>> https://www.linuxtv.org/wiki/index.php/How_to_Obtain,_Build_and_Install_V4L-DVB_Device_Drivers
>> page and applied the patch.
>> But I still have problems (see below). It doesn't seem to be the same callstack.
>> Is it the right way to get the fix ?
>
> Yes, it's the right way to get the fix. However, you've hit a new problem
> of a similar making. Please can you try with this patch as well:
>
> Thanks
> Sean
> ---
> From 84efb0bf72ae5d9183f25d69d95fb9ad9b9bc644 Mon Sep 17 00:00:00 2001
> From: Sean Young <sean@xxxxxxxx>
> Date: Sun, 29 Oct 2017 19:28:32 +0000
> Subject: [PATCH] media: dibusb: don't do DMA on stack
>
> The USB control messages require DMA to work. We cannot pass
> a stack-allocated buffer, as it is not warranted that the
> stack would be into a DMA enabled area.
>
> Signed-off-by: Sean Young <sean@xxxxxxxx>
> ---
>  drivers/media/usb/dvb-usb/dibusb-common.c | 14 ++++++++++++--
>  1 file changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/media/usb/dvb-usb/dibusb-common.c b/drivers/media/usb/dvb-usb/dibusb-common.c
> index 8207e6900656..18c6e454b1b7 100644
> --- a/drivers/media/usb/dvb-usb/dibusb-common.c
> +++ b/drivers/media/usb/dvb-usb/dibusb-common.c
> @@ -223,8 +223,18 @@ EXPORT_SYMBOL(dibusb_i2c_algo);
>
>  int dibusb_read_eeprom_byte(struct dvb_usb_device *d, u8 offs, u8 *val)
>  {
> -       u8 wbuf[1] = { offs };
> -       return dibusb_i2c_msg(d, 0x50, wbuf, 1, val, 1);
> +       u8 *wbuf;
> +       int rc;
> +
> +       wbuf = kmalloc(1, GFP_KERNEL);
> +       if (!wbuf)
> +               return -ENOMEM;
> +
> +       *wbuf = offs;
> +       rc = dibusb_i2c_msg(d, 0x50, wbuf, 1, val, 1);
> +       kfree(wbuf);
> +
> +       return rc;
>  }
>  EXPORT_SYMBOL(dibusb_read_eeprom_byte);
>
> --
> 2.13.6
>



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux