From a92d5ee8666afcb4abc7686d7b760f0fb7a0c14c Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Wed, 26 Aug 2015 07:22:49 +0200 Subject: ALSA: hda - Fix widget sysfs tree corruption after refresh When snd_hdac_refresh_widget_sysfs() is called before the first hda_widget_sysfs_init(), the next call overrides and eventually fails. This results in unexpected Oops, something like: BUG: unable to handle kernel NULL pointer dereference at 00000000000000c8 IP: [] hdmi_chmap_ctl_info+0x23/0x40 The fix is to add a check of the existing sysfs tree. Also, for more safety, this patch adds the checks of device_is_registered() in snd-hdac_refresh_wdiget_sysfs(), too. Fixes: fa4f18b4f402 ('ALSA: hda - Refresh widgets sysfs at probing Haswell+ HDMI codecs') Bugizlla: https://bugzilla.kernel.org/show_bug.cgi?id=103431 Reported-by: Andreas Reis Signed-off-by: Takashi Iwai --- sound/hda/hdac_sysfs.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'sound/hda/hdac_sysfs.c') diff --git a/sound/hda/hdac_sysfs.c b/sound/hda/hdac_sysfs.c index 089b35f6f108..c71142dea98a 100644 --- a/sound/hda/hdac_sysfs.c +++ b/sound/hda/hdac_sysfs.c @@ -390,6 +390,9 @@ int hda_widget_sysfs_init(struct hdac_device *codec) { int err; + if (codec->widgets) + return 0; /* already created */ + err = widget_tree_create(codec); if (err < 0) { widget_tree_free(codec); -- cgit v1.2.3