diff options
| author | Takashi Iwai <tiwai@suse.de> | 2011-07-27 08:01:24 -0400 |
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2011-07-27 10:05:30 -0400 |
| commit | 60a6a8425a84fa46a3831ce79197640b8224311b (patch) | |
| tree | 7bc9c871f7af52c7fc0683690aeafaf35dacd0c2 | |
| parent | 767cd365b22820df07b962b49ce04b220b98e537 (diff) | |
ALSA: hda - Fix Oops with Realtek quirks with NULL adc_nids
Somce quirk models don't set adc_nids but let the parser filling it.
But the recent code has unnecessary NULL-checks of spec->input_mux,
and it resulted in NULL dereferences.
This patch fixes that regression.
Reported-and-tested-by: Oliver Neukum <oneukum@suse.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 694327ae8b71..0383dd8a11df 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -1911,7 +1911,7 @@ static int alc_build_controls(struct hda_codec *codec) | |||
| 1911 | return err; | 1911 | return err; |
| 1912 | } | 1912 | } |
| 1913 | } | 1913 | } |
| 1914 | if (spec->cap_mixer) { | 1914 | if (spec->cap_mixer && spec->adc_nids) { |
| 1915 | const char *kname = kctl ? kctl->id.name : NULL; | 1915 | const char *kname = kctl ? kctl->id.name : NULL; |
| 1916 | for (knew = spec->cap_mixer; knew->name; knew++) { | 1916 | for (knew = spec->cap_mixer; knew->name; knew++) { |
| 1917 | if (kname && strcmp(knew->name, kname) == 0) | 1917 | if (kname && strcmp(knew->name, kname) == 0) |
| @@ -3677,7 +3677,7 @@ static int patch_alc880(struct hda_codec *codec) | |||
| 3677 | if (board_config != ALC_MODEL_AUTO) | 3677 | if (board_config != ALC_MODEL_AUTO) |
| 3678 | setup_preset(codec, &alc880_presets[board_config]); | 3678 | setup_preset(codec, &alc880_presets[board_config]); |
| 3679 | 3679 | ||
| 3680 | if (!spec->no_analog && !spec->adc_nids && spec->input_mux) { | 3680 | if (!spec->no_analog && !spec->adc_nids) { |
| 3681 | alc_auto_fill_adc_caps(codec); | 3681 | alc_auto_fill_adc_caps(codec); |
| 3682 | alc_rebuild_imux_for_auto_mic(codec); | 3682 | alc_rebuild_imux_for_auto_mic(codec); |
| 3683 | alc_remove_invalid_adc_nids(codec); | 3683 | alc_remove_invalid_adc_nids(codec); |
| @@ -3804,7 +3804,7 @@ static int patch_alc260(struct hda_codec *codec) | |||
| 3804 | if (board_config != ALC_MODEL_AUTO) | 3804 | if (board_config != ALC_MODEL_AUTO) |
| 3805 | setup_preset(codec, &alc260_presets[board_config]); | 3805 | setup_preset(codec, &alc260_presets[board_config]); |
| 3806 | 3806 | ||
| 3807 | if (!spec->no_analog && !spec->adc_nids && spec->input_mux) { | 3807 | if (!spec->no_analog && !spec->adc_nids) { |
| 3808 | alc_auto_fill_adc_caps(codec); | 3808 | alc_auto_fill_adc_caps(codec); |
| 3809 | alc_rebuild_imux_for_auto_mic(codec); | 3809 | alc_rebuild_imux_for_auto_mic(codec); |
| 3810 | alc_remove_invalid_adc_nids(codec); | 3810 | alc_remove_invalid_adc_nids(codec); |
| @@ -3983,7 +3983,7 @@ static int patch_alc882(struct hda_codec *codec) | |||
| 3983 | if (board_config != ALC_MODEL_AUTO) | 3983 | if (board_config != ALC_MODEL_AUTO) |
| 3984 | setup_preset(codec, &alc882_presets[board_config]); | 3984 | setup_preset(codec, &alc882_presets[board_config]); |
| 3985 | 3985 | ||
| 3986 | if (!spec->no_analog && !spec->adc_nids && spec->input_mux) { | 3986 | if (!spec->no_analog && !spec->adc_nids) { |
| 3987 | alc_auto_fill_adc_caps(codec); | 3987 | alc_auto_fill_adc_caps(codec); |
| 3988 | alc_rebuild_imux_for_auto_mic(codec); | 3988 | alc_rebuild_imux_for_auto_mic(codec); |
| 3989 | alc_remove_invalid_adc_nids(codec); | 3989 | alc_remove_invalid_adc_nids(codec); |
| @@ -4137,7 +4137,7 @@ static int patch_alc262(struct hda_codec *codec) | |||
| 4137 | if (board_config != ALC_MODEL_AUTO) | 4137 | if (board_config != ALC_MODEL_AUTO) |
| 4138 | setup_preset(codec, &alc262_presets[board_config]); | 4138 | setup_preset(codec, &alc262_presets[board_config]); |
| 4139 | 4139 | ||
| 4140 | if (!spec->no_analog && !spec->adc_nids && spec->input_mux) { | 4140 | if (!spec->no_analog && !spec->adc_nids) { |
| 4141 | alc_auto_fill_adc_caps(codec); | 4141 | alc_auto_fill_adc_caps(codec); |
| 4142 | alc_rebuild_imux_for_auto_mic(codec); | 4142 | alc_rebuild_imux_for_auto_mic(codec); |
| 4143 | alc_remove_invalid_adc_nids(codec); | 4143 | alc_remove_invalid_adc_nids(codec); |
| @@ -4293,7 +4293,7 @@ static int patch_alc268(struct hda_codec *codec) | |||
| 4293 | (0 << AC_AMPCAP_MUTE_SHIFT)); | 4293 | (0 << AC_AMPCAP_MUTE_SHIFT)); |
| 4294 | } | 4294 | } |
| 4295 | 4295 | ||
| 4296 | if (!spec->no_analog && !spec->adc_nids && spec->input_mux) { | 4296 | if (!spec->no_analog && !spec->adc_nids) { |
| 4297 | alc_auto_fill_adc_caps(codec); | 4297 | alc_auto_fill_adc_caps(codec); |
| 4298 | alc_rebuild_imux_for_auto_mic(codec); | 4298 | alc_rebuild_imux_for_auto_mic(codec); |
| 4299 | alc_remove_invalid_adc_nids(codec); | 4299 | alc_remove_invalid_adc_nids(codec); |
| @@ -4705,7 +4705,7 @@ static int patch_alc269(struct hda_codec *codec) | |||
| 4705 | if (board_config != ALC_MODEL_AUTO) | 4705 | if (board_config != ALC_MODEL_AUTO) |
| 4706 | setup_preset(codec, &alc269_presets[board_config]); | 4706 | setup_preset(codec, &alc269_presets[board_config]); |
| 4707 | 4707 | ||
| 4708 | if (!spec->no_analog && !spec->adc_nids && spec->input_mux) { | 4708 | if (!spec->no_analog && !spec->adc_nids) { |
| 4709 | alc_auto_fill_adc_caps(codec); | 4709 | alc_auto_fill_adc_caps(codec); |
| 4710 | alc_rebuild_imux_for_auto_mic(codec); | 4710 | alc_rebuild_imux_for_auto_mic(codec); |
| 4711 | alc_remove_invalid_adc_nids(codec); | 4711 | alc_remove_invalid_adc_nids(codec); |
| @@ -4843,7 +4843,7 @@ static int patch_alc861(struct hda_codec *codec) | |||
| 4843 | if (board_config != ALC_MODEL_AUTO) | 4843 | if (board_config != ALC_MODEL_AUTO) |
| 4844 | setup_preset(codec, &alc861_presets[board_config]); | 4844 | setup_preset(codec, &alc861_presets[board_config]); |
| 4845 | 4845 | ||
| 4846 | if (!spec->no_analog && !spec->adc_nids && spec->input_mux) { | 4846 | if (!spec->no_analog && !spec->adc_nids) { |
| 4847 | alc_auto_fill_adc_caps(codec); | 4847 | alc_auto_fill_adc_caps(codec); |
| 4848 | alc_rebuild_imux_for_auto_mic(codec); | 4848 | alc_rebuild_imux_for_auto_mic(codec); |
| 4849 | alc_remove_invalid_adc_nids(codec); | 4849 | alc_remove_invalid_adc_nids(codec); |
| @@ -4984,7 +4984,7 @@ static int patch_alc861vd(struct hda_codec *codec) | |||
| 4984 | add_verb(spec, alc660vd_eapd_verbs); | 4984 | add_verb(spec, alc660vd_eapd_verbs); |
| 4985 | } | 4985 | } |
| 4986 | 4986 | ||
| 4987 | if (!spec->no_analog && !spec->adc_nids && spec->input_mux) { | 4987 | if (!spec->no_analog && !spec->adc_nids) { |
| 4988 | alc_auto_fill_adc_caps(codec); | 4988 | alc_auto_fill_adc_caps(codec); |
| 4989 | alc_rebuild_imux_for_auto_mic(codec); | 4989 | alc_rebuild_imux_for_auto_mic(codec); |
| 4990 | alc_remove_invalid_adc_nids(codec); | 4990 | alc_remove_invalid_adc_nids(codec); |
| @@ -5200,7 +5200,7 @@ static int patch_alc662(struct hda_codec *codec) | |||
| 5200 | if (board_config != ALC_MODEL_AUTO) | 5200 | if (board_config != ALC_MODEL_AUTO) |
| 5201 | setup_preset(codec, &alc662_presets[board_config]); | 5201 | setup_preset(codec, &alc662_presets[board_config]); |
| 5202 | 5202 | ||
| 5203 | if (!spec->no_analog && !spec->adc_nids && spec->input_mux) { | 5203 | if (!spec->no_analog && !spec->adc_nids) { |
| 5204 | alc_auto_fill_adc_caps(codec); | 5204 | alc_auto_fill_adc_caps(codec); |
| 5205 | alc_rebuild_imux_for_auto_mic(codec); | 5205 | alc_rebuild_imux_for_auto_mic(codec); |
| 5206 | alc_remove_invalid_adc_nids(codec); | 5206 | alc_remove_invalid_adc_nids(codec); |
| @@ -5336,7 +5336,7 @@ static int patch_alc680(struct hda_codec *codec) | |||
| 5336 | #endif | 5336 | #endif |
| 5337 | } | 5337 | } |
| 5338 | 5338 | ||
| 5339 | if (!spec->no_analog && !spec->adc_nids && spec->input_mux) { | 5339 | if (!spec->no_analog && !spec->adc_nids) { |
| 5340 | alc_auto_fill_adc_caps(codec); | 5340 | alc_auto_fill_adc_caps(codec); |
| 5341 | alc_rebuild_imux_for_auto_mic(codec); | 5341 | alc_rebuild_imux_for_auto_mic(codec); |
| 5342 | alc_remove_invalid_adc_nids(codec); | 5342 | alc_remove_invalid_adc_nids(codec); |
