Skip to content

Commit

Permalink
ALSA: hda/realtek - Fix overflow of vol/sw check bitmap
Browse files Browse the repository at this point in the history
The bitmap introduced in the commit [527e4d7: ALSA: hda/realtek - Fix
missing volume controls with ALC260] is too narrow for some codecs,
which may have more NIDs than 0x20, thus it may overflow the bitmap
array on them.

Just double the number to cover all and also add a sanity-check code
to be safer.

Cc: <stable@kernel.org> [v3.2+]
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
Takashi Iwai committed Feb 16, 2012
1 parent 8866f40 commit c14c95f
Showing 1 changed file with 8 additions and 3 deletions.
11 changes: 8 additions & 3 deletions sound/pci/hda/patch_realtek.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ enum {
ALC_AUTOMUTE_MIXER, /* mute/unmute mixer widget AMP */
};

#define MAX_VOL_NIDS 0x40

struct alc_spec {
/* codec parameterization */
const struct snd_kcontrol_new *mixers[5]; /* mixer arrays */
Expand Down Expand Up @@ -118,8 +120,8 @@ struct alc_spec {
const hda_nid_t *capsrc_nids;
hda_nid_t dig_in_nid; /* digital-in NID; optional */
hda_nid_t mixer_nid; /* analog-mixer NID */
DECLARE_BITMAP(vol_ctls, 0x20 << 1);
DECLARE_BITMAP(sw_ctls, 0x20 << 1);
DECLARE_BITMAP(vol_ctls, MAX_VOL_NIDS << 1);
DECLARE_BITMAP(sw_ctls, MAX_VOL_NIDS << 1);

/* capture setup for dynamic dual-adc switch */
hda_nid_t cur_adc;
Expand Down Expand Up @@ -3149,7 +3151,10 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec)
static inline unsigned int get_ctl_pos(unsigned int data)
{
hda_nid_t nid = get_amp_nid_(data);
unsigned int dir = get_amp_direction_(data);
unsigned int dir;
if (snd_BUG_ON(nid >= MAX_VOL_NIDS))
return 0;
dir = get_amp_direction_(data);
return (nid << 1) | dir;
}

Expand Down

0 comments on commit c14c95f

Please sign in to comment.