All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dan Carpenter <dan.carpenter@oracle.com>
To: chris@chris-wilson.co.uk
Cc: intel-gfx@lists.freedesktop.org
Subject: [bug report] drm/i915: Eliminate lots of iterations over the execobjects array
Date: Thu, 15 Mar 2018 16:10:30 +0300	[thread overview]
Message-ID: <20180315131030.GA23041@mwanda> (raw)

Hello Chris Wilson,

The patch 2889caa92321: "drm/i915: Eliminate lots of iterations over
the execobjects array" from Jun 16, 2017, leads to the following
static checker warning:

	drivers/gpu/drm/i915/i915_gem_execbuffer.c:2546 i915_gem_execbuffer_ioctl()
	warn: calling '__copy_to_user()' without access_ok()

drivers/gpu/drm/i915/i915_gem_execbuffer.c
  2510          err = copy_from_user(exec_list,
  2511                               u64_to_user_ptr(args->buffers_ptr),
  2512                               sizeof(*exec_list) * count);
  2513          if (err) {
  2514                  DRM_DEBUG("copy %d exec entries failed %d\n",
  2515                            args->buffer_count, err);
  2516                  kvfree(exec_list);
  2517                  kvfree(exec2_list);
  2518                  return -EFAULT;
  2519          }
  2520  
  2521          for (i = 0; i < args->buffer_count; i++) {
  2522                  exec2_list[i].handle = exec_list[i].handle;
  2523                  exec2_list[i].relocation_count = exec_list[i].relocation_count;
  2524                  exec2_list[i].relocs_ptr = exec_list[i].relocs_ptr;
  2525                  exec2_list[i].alignment = exec_list[i].alignment;
  2526                  exec2_list[i].offset = exec_list[i].offset;
  2527                  if (INTEL_GEN(to_i915(dev)) < 4)
  2528                          exec2_list[i].flags = EXEC_OBJECT_NEEDS_FENCE;
  2529                  else
  2530                          exec2_list[i].flags = 0;
  2531          }
  2532  
  2533          err = i915_gem_do_execbuffer(dev, file, &exec2, exec2_list, NULL);
  2534          if (exec2.flags & __EXEC_HAS_RELOC) {
  2535                  struct drm_i915_gem_exec_object __user *user_exec_list =
  2536                          u64_to_user_ptr(args->buffers_ptr);
  2537  
  2538                  /* Copy the new buffer offsets back to the user's exec list. */
  2539                  for (i = 0; i < args->buffer_count; i++) {
  2540                          if (!(exec2_list[i].offset & UPDATE))
  2541                                  continue;
  2542  
  2543                          exec2_list[i].offset =
  2544                                  gen8_canonical_addr(exec2_list[i].offset & PIN_OFFSET_MASK);
  2545                          exec2_list[i].offset &= PIN_OFFSET_MASK;
  2546                          if (__copy_to_user(&user_exec_list[i].offset,
  2547                                             &exec2_list[i].offset,
                                                    ^^^^^^^^^^^^^^^^^^^^
  2548                                             sizeof(user_exec_list[i].offset)))
  2549                                  break;

The story of this warning is that one day Linus was grumpy about
security issues and said something like, "We should make it a rule that
code which uses __copy_to_user() should call access_ok() in that exact
same function or it becomes too hard to audit and error prone.  Can
someone write a static checker for this?"  And so I did.  But up to now
I've always just looked at the code and either figured out where the
access_ok() is or just assumed that "Probably it's there if I looked
harder".

But today I've drawn a line in the sand!  No more!

Also the error code is wrong, we should return -EFAULT if the copy
fails.  ;)

  2550                  }
  2551          }
  2552  
  2553          kvfree(exec_list);

regards,
dan carpenter
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

             reply	other threads:[~2018-03-15 13:10 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-15 13:10 Dan Carpenter [this message]
2018-03-15 13:17 ` [bug report] drm/i915: Eliminate lots of iterations over the execobjects array Chris Wilson
2018-03-15 13:33   ` Dan Carpenter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180315131030.GA23041@mwanda \
    --to=dan.carpenter@oracle.com \
    --cc=chris@chris-wilson.co.uk \
    --cc=intel-gfx@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.