Commit 3b892467 authored by Takashi Iwai's avatar Takashi Iwai Committed by Jaroslav Kysela

[ALSA] Check value range in ctl callbacks

Check the value ranges in ctl put callbacks properly (in the rest drivers).
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarJaroslav Kysela <perex@perex.cz>
parent 498ade1a
...@@ -461,13 +461,14 @@ static int snd_mts64_ctl_smpte_switch_put(struct snd_kcontrol* kctl, ...@@ -461,13 +461,14 @@ static int snd_mts64_ctl_smpte_switch_put(struct snd_kcontrol* kctl,
{ {
struct mts64 *mts = snd_kcontrol_chip(kctl); struct mts64 *mts = snd_kcontrol_chip(kctl);
int changed = 0; int changed = 0;
int val = !!uctl->value.integer.value[0];
spin_lock_irq(&mts->lock); spin_lock_irq(&mts->lock);
if (mts->smpte_switch == uctl->value.integer.value[0]) if (mts->smpte_switch == val)
goto __out; goto __out;
changed = 1; changed = 1;
mts->smpte_switch = uctl->value.integer.value[0]; mts->smpte_switch = val;
if (mts->smpte_switch) { if (mts->smpte_switch) {
mts64_smpte_start(mts->pardev->port, mts64_smpte_start(mts->pardev->port,
mts->time[0], mts->time[1], mts->time[0], mts->time[1],
...@@ -541,12 +542,13 @@ static int snd_mts64_ctl_smpte_time_put(struct snd_kcontrol *kctl, ...@@ -541,12 +542,13 @@ static int snd_mts64_ctl_smpte_time_put(struct snd_kcontrol *kctl,
{ {
struct mts64 *mts = snd_kcontrol_chip(kctl); struct mts64 *mts = snd_kcontrol_chip(kctl);
int idx = kctl->private_value; int idx = kctl->private_value;
unsigned int time = uctl->value.integer.value[0] % 60;
int changed = 0; int changed = 0;
spin_lock_irq(&mts->lock); spin_lock_irq(&mts->lock);
if (mts->time[idx] != uctl->value.integer.value[0]) { if (mts->time[idx] != time) {
changed = 1; changed = 1;
mts->time[idx] = uctl->value.integer.value[0]; mts->time[idx] = time;
} }
spin_unlock_irq(&mts->lock); spin_unlock_irq(&mts->lock);
...@@ -636,6 +638,8 @@ static int snd_mts64_ctl_smpte_fps_put(struct snd_kcontrol *kctl, ...@@ -636,6 +638,8 @@ static int snd_mts64_ctl_smpte_fps_put(struct snd_kcontrol *kctl,
struct mts64 *mts = snd_kcontrol_chip(kctl); struct mts64 *mts = snd_kcontrol_chip(kctl);
int changed = 0; int changed = 0;
if (uctl->value.enumerated.item[0] >= 5)
return -EINVAL;
spin_lock_irq(&mts->lock); spin_lock_irq(&mts->lock);
if (mts->fps != uctl->value.enumerated.item[0]) { if (mts->fps != uctl->value.enumerated.item[0]) {
changed = 1; changed = 1;
......
...@@ -113,6 +113,8 @@ static int pt2258_stereo_volume_put(struct snd_kcontrol *kcontrol, ...@@ -113,6 +113,8 @@ static int pt2258_stereo_volume_put(struct snd_kcontrol *kcontrol,
val0 = 79 - ucontrol->value.integer.value[0]; val0 = 79 - ucontrol->value.integer.value[0];
val1 = 79 - ucontrol->value.integer.value[1]; val1 = 79 - ucontrol->value.integer.value[1];
if (val0 < 0 || val0 > 79 || val1 < 0 || val1 > 79)
return -EINVAL;
if (val0 == pt->volume[base] && val1 == pt->volume[base + 1]) if (val0 == pt->volume[base] && val1 == pt->volume[base + 1])
return 0; return 0;
......
...@@ -483,6 +483,10 @@ static int snd_miro_put_double(struct snd_kcontrol *kcontrol, ...@@ -483,6 +483,10 @@ static int snd_miro_put_double(struct snd_kcontrol *kcontrol,
/* equalizer elements */ /* equalizer elements */
if (left < -0x7f || left > 0x7f ||
right < -0x7f || right > 0x7f)
return -EINVAL;
if (left_old > 0x80) if (left_old > 0x80)
left_old = 0x80 - left_old; left_old = 0x80 - left_old;
if (right_old > 0x80) if (right_old > 0x80)
...@@ -520,6 +524,10 @@ static int snd_miro_put_double(struct snd_kcontrol *kcontrol, ...@@ -520,6 +524,10 @@ static int snd_miro_put_double(struct snd_kcontrol *kcontrol,
/* non-equalizer elements */ /* non-equalizer elements */
if (left < 0 || left > 0x20 ||
right < 0 || right > 0x20)
return -EINVAL;
left_old = 0x20 - left_old; left_old = 0x20 - left_old;
right_old = 0x20 - right_old; right_old = 0x20 - right_old;
......
...@@ -523,11 +523,14 @@ static int aica_pcmvolume_put(struct snd_kcontrol *kcontrol, ...@@ -523,11 +523,14 @@ static int aica_pcmvolume_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
struct snd_card_aica *dreamcastcard; struct snd_card_aica *dreamcastcard;
unsigned int vol;
dreamcastcard = kcontrol->private_data; dreamcastcard = kcontrol->private_data;
if (unlikely(!dreamcastcard->channel)) if (unlikely(!dreamcastcard->channel))
return -ETXTBSY; return -ETXTBSY;
if (unlikely(dreamcastcard->channel->vol == vol = ucontrol->value.integer.value[0];
ucontrol->value.integer.value[0])) if (vol > 0xff)
return -EINVAL;
if (unlikely(dreamcastcard->channel->vol == vol))
return 0; return 0;
dreamcastcard->channel->vol = ucontrol->value.integer.value[0]; dreamcastcard->channel->vol = ucontrol->value.integer.value[0];
dreamcastcard->master_volume = ucontrol->value.integer.value[0]; dreamcastcard->master_volume = ucontrol->value.integer.value[0];
......
...@@ -859,7 +859,7 @@ static int snd_amd7930_put_volume(struct snd_kcontrol *kctl, struct snd_ctl_elem ...@@ -859,7 +859,7 @@ static int snd_amd7930_put_volume(struct snd_kcontrol *kctl, struct snd_ctl_elem
spin_lock_irqsave(&amd->lock, flags); spin_lock_irqsave(&amd->lock, flags);
if (*swval != ucontrol->value.integer.value[0]) { if (*swval != ucontrol->value.integer.value[0]) {
*swval = ucontrol->value.integer.value[0]; *swval = ucontrol->value.integer.value[0] & 0xff;
__amd7930_update_map(amd); __amd7930_update_map(amd);
change = 1; change = 1;
} else } else
......
...@@ -2279,9 +2279,20 @@ static int snd_cs4215_put_volume(struct snd_kcontrol *kcontrol, ...@@ -2279,9 +2279,20 @@ static int snd_cs4215_put_volume(struct snd_kcontrol *kcontrol,
struct snd_dbri *dbri = snd_kcontrol_chip(kcontrol); struct snd_dbri *dbri = snd_kcontrol_chip(kcontrol);
struct dbri_streaminfo *info = struct dbri_streaminfo *info =
&dbri->stream_info[kcontrol->private_value]; &dbri->stream_info[kcontrol->private_value];
unsigned int vol[2];
int changed = 0; int changed = 0;
if (info->left_gain != ucontrol->value.integer.value[0]) { vol[0] = ucontrol->value.integer.value[0];
vol[1] = ucontrol->value.integer.value[1];
if (kcontrol->private_value == DBRI_PLAY) {
if (vol[0] > DBRI_MAX_VOLUME || vol[1] > DBRI_MAX_VOLUME)
return -EINVAL;
} else {
if (vol[0] > DBRI_MAX_GAIN || vol[1] > DBRI_MAX_GAIN)
return -EINVAL;
}
if (info->left_gain !=
info->left_gain = ucontrol->value.integer.value[0]; info->left_gain = ucontrol->value.integer.value[0];
changed = 1; changed = 1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment