diff options
author | Jesse Barnes <jbarnes@virtuousgeek.org> | 2008-11-13 15:30:06 -0800 |
---|---|---|
committer | Jesse Barnes <jbarnes@virtuousgeek.org> | 2008-11-13 15:30:06 -0800 |
commit | 965b4d662a5236ee5aeb94a70f62565b6ed5644c (patch) | |
tree | 7645e5130046e3952c2a490d5561bafe67cbff89 /bsd-core/drm_vm.c | |
parent | 9a4cb7eab4f74747cc777a3fef31dbb46e1191e5 (diff) | |
parent | 7e27b3ba88f0c40680380636a436c18e3220c7ce (diff) |
Merge branch 'master' into modesetting-gem
Conflicts:
libdrm/Makefile.am
libdrm/intel/intel_bufmgr.h
libdrm/intel/intel_bufmgr_fake.c
libdrm/intel/intel_bufmgr_gem.c
shared-core/drm.h
shared-core/i915_dma.c
shared-core/i915_irq.c
shared-core/radeon_cp.c
shared-core/radeon_drv.h
Diffstat (limited to 'bsd-core/drm_vm.c')
-rw-r--r-- | bsd-core/drm_vm.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/bsd-core/drm_vm.c b/bsd-core/drm_vm.c index 8ee49a28..4bc6f46a 100644 --- a/bsd-core/drm_vm.c +++ b/bsd-core/drm_vm.c @@ -32,20 +32,23 @@ int drm_mmap(struct cdev *kdev, vm_offset_t offset, vm_paddr_t *paddr, int prot) { struct drm_device *dev = drm_get_device_from_kdev(kdev); - struct drm_file *file_priv; + struct drm_file *file_priv = NULL; drm_local_map_t *map; enum drm_map_type type; vm_paddr_t phys; + int error; - DRM_LOCK(); - TAILQ_FOREACH(file_priv, &dev->files, link) - if (file_priv->pid == curthread->td_proc->p_pid && - file_priv->uid == curthread->td_ucred->cr_svuid && - file_priv->authenticated == 1) - break; - DRM_UNLOCK(); + /* d_mmap gets called twice, we can only reference file_priv during + * the first call. We need to assume that if error is EBADF the + * call was succesful and the client is authenticated. + */ + error = devfs_get_cdevpriv((void **)&file_priv); + if (error == ENOENT) { + DRM_ERROR("Could not find authenticator!\n"); + return EINVAL; + } - if (!file_priv) + if (file_priv && !file_priv->authenticated) return EACCES; if (dev->dma && offset >= 0 && offset < ptoa(dev->dma->page_count)) { |