From: Liwei Song <liwei.song@windriver.com>
To: Takashi Iwai <tiwai@suse.de>
Cc: alsa-devel@alsa-project.org, Yu Zhao <yuzhao@google.com>,
Keyon Jie <yang.jie@linux.intel.com>,
linux-kernel <linux-kernel@vger.kernel.org>,
Mark Brown <broonie@kernel.org>
Subject: Re: [PATCH] ALSA: hda: check RIRB to avoid use NULL pointer
Date: Tue, 30 Apr 2019 16:32:47 +0800 [thread overview]
Message-ID: <5CC8082F.4090903@windriver.com> (raw)
In-Reply-To: <s5himuwhru3.wl-tiwai@suse.de>
On 04/30/2019 03:31 PM, Takashi Iwai wrote:
> On Tue, 30 Apr 2019 08:10:53 +0200,
> Song liwei wrote:
>>
>> From: Liwei Song <liwei.song@windriver.com>
>>
>> Fix the following BUG:
>>
>> 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.
>>
>> Check the value of RIRB to ensure it is not NULL, to aviod some special
>> case may hang the system.
>>
>> Fixes: 14752412721c ("ALSA: hda - Add the controller helper codes to hda-core module")
>> Signed-off-by: Liwei Song <liwei.song@windriver.com>
>
> Oh, that's indeed a race there.
>
> But I guess the check introduced by the patch is still error-prone.
> Basically the interrupt handling should be moved after the chip
> initialization. I suppose that your platform uses the shared
> interrupt, not the MSI?
This is the information from /proc/interrupt
134: 0 102 0 0 IR-PCI-MSI 514048-edge snd_hda_intel:card0
>
> In anyway, alternative (and likely more certain) fix would be to move
> the azx_acquir_irq() call like the patch below (note: totally
> untested). Could you check whether it works?
Yes, It works.
Considering a previous patch like the one you provide will import some issue,
so I choose check the invalid value to low the risk, but just as you mentioned,
It is not a good solution.
commit 542cedec53c9e8b73f3f05bf8468823598c50489
Author: Yu Zhao <yuzhao@google.com>
Date: Tue Sep 11 15:12:46 2018 -0600
Revert "ASoC: Intel: Skylake: Acquire irq after RIRB allocation"
This reverts commit 12eeeb4f4733bbc4481d01df35933fc15beb8b19.
The patch doesn't fix accessing memory with null pointer in
skl_interrupt().
There are two problems: 1) skl_init_chip() is called twice, before
and after dma buffer is allocate. The first call sets bus->chip_init
which prevents the second from initializing bus->corb.buf and
rirb.buf from bus->rb.area. 2) snd_hdac_bus_init_chip() enables
interrupt before snd_hdac_bus_init_cmd_io() initializing dma buffers.
There is a small window which skl_interrupt() can be called if irq
has been acquired. If so, it crashes when using null dma buffer
pointers.
Thanks,
Liwei.
>
>
> thanks,
>
> Takashi
>
>
> --- a/sound/pci/hda/hda_intel.c
> +++ b/sound/pci/hda/hda_intel.c
> @@ -1788,9 +1788,6 @@ static int azx_first_init(struct azx *chip)
> chip->msi = 0;
> }
>
> - if (azx_acquire_irq(chip, 0) < 0)
> - return -EBUSY;
> -
> pci_set_master(pci);
> synchronize_irq(bus->irq);
>
> @@ -1904,6 +1901,9 @@ static int azx_first_init(struct azx *chip)
> return -ENODEV;
> }
>
> + if (azx_acquire_irq(chip, 0) < 0)
> + return -EBUSY;
> +
> strcpy(card->driver, "HDA-Intel");
> strlcpy(card->shortname, driver_short_names[chip->driver_type],
> sizeof(card->shortname));
>
>
WARNING: multiple messages have this Message-ID (diff)
From: Liwei Song <liwei.song@windriver.com>
To: Takashi Iwai <tiwai@suse.de>
Cc: <alsa-devel@alsa-project.org>, Yu Zhao <yuzhao@google.com>,
Mark Brown <broonie@kernel.org>,
Keyon Jie <yang.jie@linux.intel.com>,
Jaroslav Kysela <perex@perex.cz>,
linux-kernel <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] ALSA: hda: check RIRB to avoid use NULL pointer
Date: Tue, 30 Apr 2019 16:32:47 +0800 [thread overview]
Message-ID: <5CC8082F.4090903@windriver.com> (raw)
In-Reply-To: <s5himuwhru3.wl-tiwai@suse.de>
On 04/30/2019 03:31 PM, Takashi Iwai wrote:
> On Tue, 30 Apr 2019 08:10:53 +0200,
> Song liwei wrote:
>>
>> From: Liwei Song <liwei.song@windriver.com>
>>
>> Fix the following BUG:
>>
>> 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.
>>
>> Check the value of RIRB to ensure it is not NULL, to aviod some special
>> case may hang the system.
>>
>> Fixes: 14752412721c ("ALSA: hda - Add the controller helper codes to hda-core module")
>> Signed-off-by: Liwei Song <liwei.song@windriver.com>
>
> Oh, that's indeed a race there.
>
> But I guess the check introduced by the patch is still error-prone.
> Basically the interrupt handling should be moved after the chip
> initialization. I suppose that your platform uses the shared
> interrupt, not the MSI?
This is the information from /proc/interrupt
134: 0 102 0 0 IR-PCI-MSI 514048-edge snd_hda_intel:card0
>
> In anyway, alternative (and likely more certain) fix would be to move
> the azx_acquir_irq() call like the patch below (note: totally
> untested). Could you check whether it works?
Yes, It works.
Considering a previous patch like the one you provide will import some issue,
so I choose check the invalid value to low the risk, but just as you mentioned,
It is not a good solution.
commit 542cedec53c9e8b73f3f05bf8468823598c50489
Author: Yu Zhao <yuzhao@google.com>
Date: Tue Sep 11 15:12:46 2018 -0600
Revert "ASoC: Intel: Skylake: Acquire irq after RIRB allocation"
This reverts commit 12eeeb4f4733bbc4481d01df35933fc15beb8b19.
The patch doesn't fix accessing memory with null pointer in
skl_interrupt().
There are two problems: 1) skl_init_chip() is called twice, before
and after dma buffer is allocate. The first call sets bus->chip_init
which prevents the second from initializing bus->corb.buf and
rirb.buf from bus->rb.area. 2) snd_hdac_bus_init_chip() enables
interrupt before snd_hdac_bus_init_cmd_io() initializing dma buffers.
There is a small window which skl_interrupt() can be called if irq
has been acquired. If so, it crashes when using null dma buffer
pointers.
Thanks,
Liwei.
>
>
> thanks,
>
> Takashi
>
>
> --- a/sound/pci/hda/hda_intel.c
> +++ b/sound/pci/hda/hda_intel.c
> @@ -1788,9 +1788,6 @@ static int azx_first_init(struct azx *chip)
> chip->msi = 0;
> }
>
> - if (azx_acquire_irq(chip, 0) < 0)
> - return -EBUSY;
> -
> pci_set_master(pci);
> synchronize_irq(bus->irq);
>
> @@ -1904,6 +1901,9 @@ static int azx_first_init(struct azx *chip)
> return -ENODEV;
> }
>
> + if (azx_acquire_irq(chip, 0) < 0)
> + return -EBUSY;
> +
> strcpy(card->driver, "HDA-Intel");
> strlcpy(card->shortname, driver_short_names[chip->driver_type],
> sizeof(card->shortname));
>
>
next prev parent reply other threads:[~2019-04-30 8:34 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-30 6:10 [PATCH] ALSA: hda: check RIRB to avoid use NULL pointer Song liwei
2019-04-30 6:10 ` Song liwei
2019-04-30 7:31 ` Takashi Iwai
2019-04-30 7:31 ` Takashi Iwai
2019-04-30 8:32 ` Liwei Song [this message]
2019-04-30 8:32 ` Liwei Song
2019-04-30 8:53 ` Takashi Iwai
2019-04-30 8:53 ` Takashi Iwai
2019-04-30 9:29 ` Liwei Song
2019-04-30 9:29 ` Liwei Song
2019-04-30 10:17 ` Takashi Iwai
2019-04-30 10:17 ` Takashi Iwai
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=5CC8082F.4090903@windriver.com \
--to=liwei.song@windriver.com \
--cc=alsa-devel@alsa-project.org \
--cc=broonie@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=tiwai@suse.de \
--cc=yang.jie@linux.intel.com \
--cc=yuzhao@google.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.