From 1a37ddf1535ceb0a6fa4e3190d55406b2a51708c Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Date: Sat, 21 Jul 2007 11:34:44 +0300 Subject: [PATCH] Fix misc ioctl issues, makes Nouveau run. Debug print in drm_release(). Local var init in drm_setversion(). Unnecessary put_user() in drm_addmap_ioctl(). ioctl->cmd checks in drm_ioctl(). --- linux-core/drm_bufs.c | 3 +-- linux-core/drm_drv.c | 19 +++++++++++-------- linux-core/drm_fops.c | 2 +- linux-core/drm_ioctl.c | 2 +- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/linux-core/drm_bufs.c b/linux-core/drm_bufs.c index e8864df..665bc65 100644 --- a/linux-core/drm_bufs.c +++ b/linux-core/drm_bufs.c @@ -343,8 +343,7 @@ int drm_addmap_ioctl(struct drm_device *dev, void *data, return err; /* avoid a warning on 64-bit, this casting isn't very nice, but the API is set so too late */ - if (put_user((void *)(unsigned long)maplist->user_token, &map->handle)) - return -EFAULT; + map->handle = (void *)(unsigned long)maplist->user_token; return 0; } diff --git a/linux-core/drm_drv.c b/linux-core/drm_drv.c index 8a67579..9fc6535 100644 --- a/linux-core/drm_drv.c +++ b/linux-core/drm_drv.c @@ -594,16 +594,19 @@ int drm_ioctl(struct inode *inode, struct file *filp, ((nr < DRM_COMMAND_BASE) || (nr >= DRM_COMMAND_END))) goto err_i1; if ((nr >= DRM_COMMAND_BASE) && (nr < DRM_COMMAND_END) - && (nr < DRM_COMMAND_BASE + dev->driver->num_ioctls)) + && (nr < DRM_COMMAND_BASE + dev->driver->num_ioctls)) { ioctl = &dev->driver->ioctls[nr - DRM_COMMAND_BASE]; - else if ((nr >= DRM_COMMAND_END) || (nr < DRM_COMMAND_BASE)) + if (ioctl->cmd + DRM_COMMAND_BASE != nr) { + retcode = -EINVAL; + goto err_i1; + } + } else if ((nr >= DRM_COMMAND_END) || (nr < DRM_COMMAND_BASE)) { ioctl = &drm_ioctls[nr]; - else { - retcode = -EINVAL; - goto err_i1; - } - - if (ioctl->cmd != cmd) { + if (ioctl->cmd != cmd) { + retcode = -EINVAL; + goto err_i1; + } + } else { retcode = -EINVAL; goto err_i1; } diff --git a/linux-core/drm_fops.c b/linux-core/drm_fops.c index 251ee5b..ab5f4ca 100644 --- a/linux-core/drm_fops.c +++ b/linux-core/drm_fops.c @@ -403,7 +403,7 @@ int drm_release(struct inode *inode, struct file *filp) */ DRM_DEBUG("pid = %d, device = 0x%lx, open_count = %d\n", - current->pid, (long)old_encode_dev(dev), + current->pid, (long)old_encode_dev(file_priv->head->device), dev->open_count); if (dev->driver->reclaim_buffers_locked && dev->lock.hw_lock) { diff --git a/linux-core/drm_ioctl.c b/linux-core/drm_ioctl.c index 717e23c..f3f757d 100644 --- a/linux-core/drm_ioctl.c +++ b/linux-core/drm_ioctl.c @@ -301,7 +301,7 @@ int drm_getstats(struct drm_device *dev, void *data, int drm_setversion(struct drm_device *dev, void *data, struct drm_file *file_priv) { struct drm_set_version *sv = data; - int if_version, retcode; + int if_version, retcode = 0; if (sv->drm_di_major != -1) { if (sv->drm_di_major != DRM_IF_MAJOR || -- 1.5.1.6