diff options
author | Dan Carpenter <error27@gmail.com> | 2010-10-20 02:57:34 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-11-09 16:31:48 -0500 |
commit | 08da782b1a58fd63199928176909e103477c933a (patch) | |
tree | e427553b3bf83fbf9a462cb79ff9933f5b3a369a | |
parent | e9f25689a86570c30d3f101b1f9834a579bed2e5 (diff) |
Staging: sst: user pointers in intel_sst_mmap_play_capture()
There were some places in intel_sst_mmap_play_capture() that
dereferenced user pointers instead of copying the data to the kernel.
I removed the BUG_ON(!mmap_buf) and BUG_ON(!buf_entry) since those are
never possible in the current code.
Signed-off-by: Dan Carpenter <error27@gmail.com>
Cc: Vinod Koul <vinod.koul@intel.com>
Cc: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/staging/intel_sst/intel_sst_app_interface.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/drivers/staging/intel_sst/intel_sst_app_interface.c b/drivers/staging/intel_sst/intel_sst_app_interface.c index d20724d3b68d..834bb617524b 100644 --- a/drivers/staging/intel_sst/intel_sst_app_interface.c +++ b/drivers/staging/intel_sst/intel_sst_app_interface.c | |||
@@ -244,12 +244,12 @@ static int intel_sst_mmap_play_capture(u32 str_id, | |||
244 | int retval, i; | 244 | int retval, i; |
245 | struct stream_info *stream; | 245 | struct stream_info *stream; |
246 | struct snd_sst_mmap_buff_entry *buf_entry; | 246 | struct snd_sst_mmap_buff_entry *buf_entry; |
247 | struct snd_sst_mmap_buff_entry *tmp_buf; | ||
247 | 248 | ||
248 | pr_debug("sst:called for str_id %d\n", str_id); | 249 | pr_debug("sst:called for str_id %d\n", str_id); |
249 | retval = sst_validate_strid(str_id); | 250 | retval = sst_validate_strid(str_id); |
250 | if (retval) | 251 | if (retval) |
251 | return -EINVAL; | 252 | return -EINVAL; |
252 | BUG_ON(!mmap_buf); | ||
253 | 253 | ||
254 | stream = &sst_drv_ctx->streams[str_id]; | 254 | stream = &sst_drv_ctx->streams[str_id]; |
255 | if (stream->mmapped != true) | 255 | if (stream->mmapped != true) |
@@ -262,14 +262,24 @@ static int intel_sst_mmap_play_capture(u32 str_id, | |||
262 | stream->curr_bytes = 0; | 262 | stream->curr_bytes = 0; |
263 | stream->cumm_bytes = 0; | 263 | stream->cumm_bytes = 0; |
264 | 264 | ||
265 | tmp_buf = kcalloc(mmap_buf->entries, sizeof(*tmp_buf), GFP_KERNEL); | ||
266 | if (!tmp_buf) | ||
267 | return -ENOMEM; | ||
268 | if (copy_from_user(tmp_buf, (void __user *)mmap_buf->buff, | ||
269 | mmap_buf->entries * sizeof(*tmp_buf))) { | ||
270 | retval = -EFAULT; | ||
271 | goto out_free; | ||
272 | } | ||
273 | |||
265 | pr_debug("sst:new buffers count %d status %d\n", | 274 | pr_debug("sst:new buffers count %d status %d\n", |
266 | mmap_buf->entries, stream->status); | 275 | mmap_buf->entries, stream->status); |
267 | buf_entry = mmap_buf->buff; | 276 | buf_entry = tmp_buf; |
268 | for (i = 0; i < mmap_buf->entries; i++) { | 277 | for (i = 0; i < mmap_buf->entries; i++) { |
269 | BUG_ON(!buf_entry); | ||
270 | bufs = kzalloc(sizeof(*bufs), GFP_KERNEL); | 278 | bufs = kzalloc(sizeof(*bufs), GFP_KERNEL); |
271 | if (!bufs) | 279 | if (!bufs) { |
272 | return -ENOMEM; | 280 | retval = -ENOMEM; |
281 | goto out_free; | ||
282 | } | ||
273 | bufs->size = buf_entry->size; | 283 | bufs->size = buf_entry->size; |
274 | bufs->offset = buf_entry->offset; | 284 | bufs->offset = buf_entry->offset; |
275 | bufs->addr = sst_drv_ctx->mmap_mem; | 285 | bufs->addr = sst_drv_ctx->mmap_mem; |
@@ -293,13 +303,15 @@ static int intel_sst_mmap_play_capture(u32 str_id, | |||
293 | if (sst_play_frame(str_id) < 0) { | 303 | if (sst_play_frame(str_id) < 0) { |
294 | pr_warn("sst: play frames fail\n"); | 304 | pr_warn("sst: play frames fail\n"); |
295 | mutex_unlock(&stream->lock); | 305 | mutex_unlock(&stream->lock); |
296 | return -EIO; | 306 | retval = -EIO; |
307 | goto out_free; | ||
297 | } | 308 | } |
298 | } else if (stream->ops == STREAM_OPS_CAPTURE) { | 309 | } else if (stream->ops == STREAM_OPS_CAPTURE) { |
299 | if (sst_capture_frame(str_id) < 0) { | 310 | if (sst_capture_frame(str_id) < 0) { |
300 | pr_warn("sst: capture frame fail\n"); | 311 | pr_warn("sst: capture frame fail\n"); |
301 | mutex_unlock(&stream->lock); | 312 | mutex_unlock(&stream->lock); |
302 | return -EIO; | 313 | retval = -EIO; |
314 | goto out_free; | ||
303 | } | 315 | } |
304 | } | 316 | } |
305 | } | 317 | } |
@@ -314,6 +326,9 @@ static int intel_sst_mmap_play_capture(u32 str_id, | |||
314 | if (retval >= 0) | 326 | if (retval >= 0) |
315 | retval = stream->cumm_bytes; | 327 | retval = stream->cumm_bytes; |
316 | pr_debug("sst:end of play/rec ioctl bytes = %d!!\n", retval); | 328 | pr_debug("sst:end of play/rec ioctl bytes = %d!!\n", retval); |
329 | |||
330 | out_free: | ||
331 | kfree(tmp_buf); | ||
317 | return retval; | 332 | return retval; |
318 | } | 333 | } |
319 | 334 | ||