diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2018-01-07 13:09:15 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2018-01-19 22:35:36 -0500 |
commit | 88a890375fa2fd9b54083979403243ab24a3ca35 (patch) | |
tree | abe9f45eea0f907adeb71e91048f1704e2014396 | |
parent | 50fd2f298bef9d1f69ac755f1fdf70cd98746be2 (diff) |
replace_user_tlv(): switch to vmemdup_user()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | sound/core/control.c | 9 |
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 | } |