aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/i915_gem_execbuffer.c54
1 files changed, 32 insertions, 22 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index 2c9d9cbaf653..7aaf6390cfaf 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -773,9 +773,9 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,
773 * relocations were valid. 773 * relocations were valid.
774 */ 774 */
775 for (j = 0; j < exec[i].relocation_count; j++) { 775 for (j = 0; j < exec[i].relocation_count; j++) {
776 if (copy_to_user(&user_relocs[j].presumed_offset, 776 if (__copy_to_user(&user_relocs[j].presumed_offset,
777 &invalid_offset, 777 &invalid_offset,
778 sizeof(invalid_offset))) { 778 sizeof(invalid_offset))) {
779 ret = -EFAULT; 779 ret = -EFAULT;
780 mutex_lock(&dev->struct_mutex); 780 mutex_lock(&dev->struct_mutex);
781 goto err; 781 goto err;
@@ -1355,18 +1355,21 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,
1355 1355
1356 ret = i915_gem_do_execbuffer(dev, data, file, &exec2, exec2_list); 1356 ret = i915_gem_do_execbuffer(dev, data, file, &exec2, exec2_list);
1357 if (!ret) { 1357 if (!ret) {
1358 struct drm_i915_gem_exec_object __user *user_exec_list =
1359 to_user_ptr(args->buffers_ptr);
1360
1358 /* Copy the new buffer offsets back to the user's exec list. */ 1361 /* Copy the new buffer offsets back to the user's exec list. */
1359 for (i = 0; i < args->buffer_count; i++) 1362 for (i = 0; i < args->buffer_count; i++) {
1360 exec_list[i].offset = exec2_list[i].offset; 1363 ret = __copy_to_user(&user_exec_list[i].offset,
1361 /* ... and back out to userspace */ 1364 &exec2_list[i].offset,
1362 ret = copy_to_user(to_user_ptr(args->buffers_ptr), 1365 sizeof(user_exec_list[i].offset));
1363 exec_list, 1366 if (ret) {
1364 sizeof(*exec_list) * args->buffer_count); 1367 ret = -EFAULT;
1365 if (ret) { 1368 DRM_DEBUG("failed to copy %d exec entries "
1366 ret = -EFAULT; 1369 "back to user (%d)\n",
1367 DRM_DEBUG("failed to copy %d exec entries " 1370 args->buffer_count, ret);
1368 "back to user (%d)\n", 1371 break;
1369 args->buffer_count, ret); 1372 }
1370 } 1373 }
1371 } 1374 }
1372 1375
@@ -1412,14 +1415,21 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,
1412 ret = i915_gem_do_execbuffer(dev, data, file, args, exec2_list); 1415 ret = i915_gem_do_execbuffer(dev, data, file, args, exec2_list);
1413 if (!ret) { 1416 if (!ret) {
1414 /* Copy the new buffer offsets back to the user's exec list. */ 1417 /* Copy the new buffer offsets back to the user's exec list. */
1415 ret = copy_to_user(to_user_ptr(args->buffers_ptr), 1418 struct drm_i915_gem_exec_object2 *user_exec_list =
1416 exec2_list, 1419 to_user_ptr(args->buffers_ptr);
1417 sizeof(*exec2_list) * args->buffer_count); 1420 int i;
1418 if (ret) { 1421
1419 ret = -EFAULT; 1422 for (i = 0; i < args->buffer_count; i++) {
1420 DRM_DEBUG("failed to copy %d exec entries " 1423 ret = __copy_to_user(&user_exec_list[i].offset,
1421 "back to user (%d)\n", 1424 &exec2_list[i].offset,
1422 args->buffer_count, ret); 1425 sizeof(user_exec_list[i].offset));
1426 if (ret) {
1427 ret = -EFAULT;
1428 DRM_DEBUG("failed to copy %d exec entries "
1429 "back to user\n",
1430 args->buffer_count);
1431 break;
1432 }
1423 } 1433 }
1424 } 1434 }
1425 1435