diff options
author | Clemens Ladisch <clemens@ladisch.de> | 2011-03-07 13:22:50 +0100 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2011-03-08 12:59:48 +0100 |
commit | 7c7335877105364f7f5181e80ff34206b54be81f (patch) | |
tree | 59d80caf4d634ff51765aa53dea8c4da4903e156 /sound/core/control.c | |
parent | bdd3255d3adcb9f4fd70c09ec71eb1c5b36d833e (diff) | |
download | linux-7c7335877105364f7f5181e80ff34206b54be81f.tar.gz linux-7c7335877105364f7f5181e80ff34206b54be81f.tar.bz2 linux-7c7335877105364f7f5181e80ff34206b54be81f.zip |
ALSA: control: fix numid conflict check for new controls
The purpose of the snd_ctl_hole_check() function is to find conflicts
between the numerical IDs of the new control and those of any existing
controls. However, it would fail to detect an existing control whose
count is smaller than the new control's count and whose interval of IDs
is entirely contained in the interval of the new control's IDs.
To fix this, use the correct formula to detect overlapping intervals,
which happens to simplify the condition.
This problem was not encountered so far because ALSA does not yet allow
drivers to allocate specific control IDs.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/core/control.c')
-rw-r--r-- | sound/core/control.c | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/sound/core/control.c b/sound/core/control.c index 9ce00ed20fba..d1b5ce818a4f 100644 --- a/sound/core/control.c +++ b/sound/core/control.c @@ -285,10 +285,8 @@ static unsigned int snd_ctl_hole_check(struct snd_card *card, struct snd_kcontrol *kctl; list_for_each_entry(kctl, &card->controls, list) { - if ((kctl->id.numid <= card->last_numid && - kctl->id.numid + kctl->count > card->last_numid) || - (kctl->id.numid <= card->last_numid + count - 1 && - kctl->id.numid + kctl->count > card->last_numid + count - 1)) + if (kctl->id.numid < card->last_numid + 1 + count && + kctl->id.numid + kctl->count > card->last_numid + 1) return card->last_numid = kctl->id.numid + kctl->count - 1; } return card->last_numid; |