BSD: Return EINVAL if drm_unlock is called on an unheld or other-owner lock.

main
Eric Anholt 2007-08-15 13:42:04 -07:00
parent 9254e00e4b
commit 6e93c35ba7
1 changed files with 6 additions and 0 deletions

View File

@ -173,6 +173,12 @@ int drm_unlock(drm_device_t *dev, void *data, struct drm_file *file_priv)
DRM_CURRENTPID, lock->context); DRM_CURRENTPID, lock->context);
return EINVAL; return EINVAL;
} }
/* Check that the context unlock being requested actually matches
* who currently holds the lock.
*/
if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock) ||
_DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock) != lock->context)
return EINVAL;
atomic_inc(&dev->counts[_DRM_STAT_UNLOCKS]); atomic_inc(&dev->counts[_DRM_STAT_UNLOCKS]);