[linux-yocto] [linux-yocto v5.0/standard/base][PATCH] ALSA: hda: check RIRB to avoid use NULL pointer

Bruce Ashfield bruce.ashfield at gmail.com
Mon Apr 29 12:38:37 PDT 2019


On Sun, Apr 28, 2019 at 4:42 AM Liwei Song <liwei.song at windriver.com> wrote:

> Fix the following BUG:
>
>
Is this also a bug in the mainline kernel ? If so, what's the resolution
for the issue there ?

Bruce



> BUG: unable to handle kernel NULL pointer dereference at 000000000000000c
> Workqueue: events azx_probe_work [snd_hda_intel]
> RIP: 0010:snd_hdac_bus_update_rirb+0x80/0x160 [snd_hda_core]
> Call Trace:
>  <IRQ>
>  azx_interrupt+0x78/0x140 [snd_hda_codec]
>  __handle_irq_event_percpu+0x49/0x300
>  handle_irq_event_percpu+0x23/0x60
>  handle_irq_event+0x3c/0x60
>  handle_edge_irq+0xdb/0x180
>  handle_irq+0x23/0x30
>  do_IRQ+0x6a/0x140
>  common_interrupt+0xf/0xf
>
> The Call Trace happened when run kdump on a NFS rootfs system.
> Exist the following calling sequence when boot the second kernel:
>
> azx_first_init()
>    --> azx_acquire_irq()
>                       <-- interrupt come in, azx_interrupt() was called
>    --> hda_intel_init_chip()
>       --> azx_init_chip()
>          --> snd_hdac_bus_init_chip()
>               --> snd_hdac_bus_init_cmd_io();
>                     --> init rirb.buf and corb.buf
>
> Interrupt happened after azx_acquire_irq() while RIRB still didn't got
> initialized, then NULL pointer will be used when process the interrupt.
>
> Considering adjust the calling sequence may import new issue like
> 2eeeb4f4733b ("ASoC: Intel: Skylake: Acquire irq after RIRB allocation")
> so here simply check the value of RIRB to avoid using NULL pointer.
>
> Fixes: 14752412721c ("ALSA: hda - Add the controller helper codes to
> hda-core module")
> Signed-off-by: Liwei Song <liwei.song at windriver.com>
> ---
>  sound/hda/hdac_controller.c | 3 +++
>  1 file changed, 3 insertions(+)
>
> diff --git a/sound/hda/hdac_controller.c b/sound/hda/hdac_controller.c
> index 74244d8e2909..2f0fa5353361 100644
> --- a/sound/hda/hdac_controller.c
> +++ b/sound/hda/hdac_controller.c
> @@ -195,6 +195,9 @@ void snd_hdac_bus_update_rirb(struct hdac_bus *bus)
>                 return;
>         bus->rirb.wp = wp;
>
> +       if (!bus->rirb.buf)
> +               return;
> +
>         while (bus->rirb.rp != wp) {
>                 bus->rirb.rp++;
>                 bus->rirb.rp %= AZX_MAX_RIRB_ENTRIES;
> --
> 2.7.4
>
>

-- 
- Thou shalt not follow the NULL pointer, for chaos and madness await thee
at its end
- "Use the force Harry" - Gandalf, Star Trek II
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.yoctoproject.org/pipermail/linux-yocto/attachments/20190429/be8068ef/attachment.html>


More information about the linux-yocto mailing list