| From c1099c3294c2344110085a38c50e478a5992b368 Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Mon, 29 Feb 2016 14:32:42 +0100 |
| Subject: ALSA: hdspm: Fix zero-division |
| |
| From: Takashi Iwai <tiwai@suse.de> |
| |
| commit c1099c3294c2344110085a38c50e478a5992b368 upstream. |
| |
| HDSPM driver contains a code issuing zero-division potentially in |
| system sample rate ctl code. This patch fixes it by not processing |
| a zero or invalid rate value as a divisor, as well as excluding the |
| invalid value to be passed via the given ctl element. |
| |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/pci/rme9652/hdspm.c | 8 ++++++++ |
| 1 file changed, 8 insertions(+) |
| |
| --- a/sound/pci/rme9652/hdspm.c |
| +++ b/sound/pci/rme9652/hdspm.c |
| @@ -1423,6 +1423,9 @@ static void hdspm_set_dds_value(struct h |
| { |
| u64 n; |
| |
| + if (snd_BUG_ON(rate <= 0)) |
| + return; |
| + |
| if (rate >= 112000) |
| rate /= 4; |
| else if (rate >= 56000) |
| @@ -2045,6 +2048,8 @@ static int hdspm_get_system_sample_rate( |
| } else { |
| /* slave mode, return external sample rate */ |
| rate = hdspm_external_sample_rate(hdspm); |
| + if (!rate) |
| + rate = hdspm->system_sample_rate; |
| } |
| } |
| |
| @@ -2090,7 +2095,10 @@ static int snd_hdspm_put_system_sample_r |
| ucontrol) |
| { |
| struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); |
| + int rate = ucontrol->value.integer.value[0]; |
| |
| + if (rate < 27000 || rate > 207000) |
| + return -EINVAL; |
| hdspm_set_dds_value(hdspm, ucontrol->value.integer.value[0]); |
| return 0; |
| } |