aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2018-01-07 13:09:15 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2018-01-19 22:35:36 -0500
commit88a890375fa2fd9b54083979403243ab24a3ca35 (patch)
treeabe9f45eea0f907adeb71e91048f1704e2014396
parent50fd2f298bef9d1f69ac755f1fdf70cd98746be2 (diff)
replace_user_tlv(): switch to vmemdup_user()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--sound/core/control.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/sound/core/control.c b/sound/core/control.c
index 56b3e2d49c82..eaef67bd004b 100644
--- a/sound/core/control.c
+++ b/sound/core/control.c
@@ -25,6 +25,7 @@
25#include <linux/slab.h> 25#include <linux/slab.h>
26#include <linux/vmalloc.h> 26#include <linux/vmalloc.h>
27#include <linux/time.h> 27#include <linux/time.h>
28#include <linux/mm.h>
28#include <linux/sched/signal.h> 29#include <linux/sched/signal.h>
29#include <sound/core.h> 30#include <sound/core.h>
30#include <sound/minors.h> 31#include <sound/minors.h>
@@ -1129,7 +1130,7 @@ static int replace_user_tlv(struct snd_kcontrol *kctl, unsigned int __user *buf,
1129 if (size > 1024 * 128) /* sane value */ 1130 if (size > 1024 * 128) /* sane value */
1130 return -EINVAL; 1131 return -EINVAL;
1131 1132
1132 container = memdup_user(buf, size); 1133 container = vmemdup_user(buf, size);
1133 if (IS_ERR(container)) 1134 if (IS_ERR(container))
1134 return PTR_ERR(container); 1135 return PTR_ERR(container);
1135 1136
@@ -1137,7 +1138,7 @@ static int replace_user_tlv(struct snd_kcontrol *kctl, unsigned int __user *buf,
1137 if (!change) 1138 if (!change)
1138 change = memcmp(ue->tlv_data, container, size) != 0; 1139 change = memcmp(ue->tlv_data, container, size) != 0;
1139 if (!change) { 1140 if (!change) {
1140 kfree(container); 1141 kvfree(container);
1141 return 0; 1142 return 0;
1142 } 1143 }
1143 1144
@@ -1148,7 +1149,7 @@ static int replace_user_tlv(struct snd_kcontrol *kctl, unsigned int __user *buf,
1148 mask = SNDRV_CTL_EVENT_MASK_INFO; 1149 mask = SNDRV_CTL_EVENT_MASK_INFO;
1149 } 1150 }
1150 1151
1151 kfree(ue->tlv_data); 1152 kvfree(ue->tlv_data);
1152 ue->tlv_data = container; 1153 ue->tlv_data = container;
1153 ue->tlv_data_size = size; 1154 ue->tlv_data_size = size;
1154 1155
@@ -1225,7 +1226,7 @@ static void snd_ctl_elem_user_free(struct snd_kcontrol *kcontrol)
1225{ 1226{
1226 struct user_element *ue = kcontrol->private_data; 1227 struct user_element *ue = kcontrol->private_data;
1227 1228
1228 kfree(ue->tlv_data); 1229 kvfree(ue->tlv_data);
1229 kfree(ue->priv_data); 1230 kfree(ue->priv_data);
1230 kfree(ue); 1231 kfree(ue);
1231} 1232}