| From 88c54cdf61f508ebcf8da2d819f5dfc03e954d1d Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Tue, 22 Aug 2017 08:15:13 +0200 |
| Subject: ALSA: core: Fix unexpected error at replacing user TLV |
| |
| From: Takashi Iwai <tiwai@suse.de> |
| |
| commit 88c54cdf61f508ebcf8da2d819f5dfc03e954d1d upstream. |
| |
| When user tries to replace the user-defined control TLV, the kernel |
| checks the change of its content via memcmp(). The problem is that |
| the kernel passes the return value from memcmp() as is. memcmp() |
| gives a non-zero negative value depending on the comparison result, |
| and this shall be recognized as an error code. |
| |
| The patch covers that corner-case, return 1 properly for the changed |
| TLV. |
| |
| Fixes: 8aa9b586e420 ("[ALSA] Control API - more robust TLV implementation") |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/core/control.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/sound/core/control.c |
| +++ b/sound/core/control.c |
| @@ -1156,7 +1156,7 @@ static int snd_ctl_elem_user_tlv(struct |
| mutex_lock(&ue->card->user_ctl_lock); |
| change = ue->tlv_data_size != size; |
| if (!change) |
| - change = memcmp(ue->tlv_data, new_data, size); |
| + change = memcmp(ue->tlv_data, new_data, size) != 0; |
| kfree(ue->tlv_data); |
| ue->tlv_data = new_data; |
| ue->tlv_data_size = size; |