diff options
author | Dave Airlie <airlied@redhat.com> | 2008-02-07 14:51:32 +1000 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2008-02-07 15:12:00 +1000 |
commit | 9d5b3ffc42f7820e8ee07705496955e4c2c38dd9 (patch) | |
tree | a7c47cfddc8ac48dc595e7b9e6f9f49788f2f82f /drivers/char | |
parent | 19a8f59ab8ceee751ea720085098355d53f727d6 (diff) | |
download | linux-9d5b3ffc42f7820e8ee07705496955e4c2c38dd9.tar.gz linux-9d5b3ffc42f7820e8ee07705496955e4c2c38dd9.tar.bz2 linux-9d5b3ffc42f7820e8ee07705496955e4c2c38dd9.zip |
drm: fixup some of the ioctl function exit paths
Signed-off-by: Dave Airlie <airlied@linux.ie>
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/drm/drm_drv.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/char/drm/drm_drv.c b/drivers/char/drm/drm_drv.c index 77e2fb7b7b37..0e7af53c87de 100644 --- a/drivers/char/drm/drm_drv.c +++ b/drivers/char/drm/drm_drv.c @@ -495,23 +495,25 @@ int drm_ioctl(struct inode *inode, struct file *filp, } else { if (cmd & (IOC_IN | IOC_OUT)) { kdata = kmalloc(_IOC_SIZE(cmd), GFP_KERNEL); - if (!kdata) - return -ENOMEM; + if (!kdata) { + retcode = -ENOMEM; + goto err_i1; + } } if (cmd & IOC_IN) { if (copy_from_user(kdata, (void __user *)arg, _IOC_SIZE(cmd)) != 0) { - retcode = -EACCES; + retcode = -EFAULT; goto err_i1; } } retcode = func(dev, kdata, file_priv); - if (cmd & IOC_OUT) { + if ((retcode == 0) && (cmd & IOC_OUT)) { if (copy_to_user((void __user *)arg, kdata, _IOC_SIZE(cmd)) != 0) - retcode = -EACCES; + retcode = -EFAULT; } } |