summaryrefslogtreecommitdiffstats
path: root/cryptodev_main.c
diff options
context:
space:
mode:
authorMiloslav Trmač <mitr@redhat.com>2010-07-09 09:15:04 +0200
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2010-07-19 09:25:50 +0200
commitce9ad0144a1a40e149f0efa9def2faf02c7a7694 (patch)
tree7e9c3d574d4bfe408bdf3acc27a988a42da13ba1 /cryptodev_main.c
parent4dabb1704fda63f6afde68275fa7027dc8d61ba7 (diff)
downloadcryptodev-linux-ce9ad0144a1a40e149f0efa9def2faf02c7a7694.tar.gz
cryptodev-linux-ce9ad0144a1a40e149f0efa9def2faf02c7a7694.tar.xz
cryptodev-linux-ce9ad0144a1a40e149f0efa9def2faf02c7a7694.zip
Free data on error its descriptor to user-space
Signed-off-by: Nikos Mavrogiannopoulos <nmav@gnutls.org>
Diffstat (limited to 'cryptodev_main.c')
-rw-r--r--cryptodev_main.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/cryptodev_main.c b/cryptodev_main.c
index d677d5b..d481a66 100644
--- a/cryptodev_main.c
+++ b/cryptodev_main.c
@@ -619,7 +619,12 @@ cryptodev_ioctl(struct inode *inode, struct file *filp,
ret = crypto_create_session(fcr, &sop);
if (unlikely(ret))
return ret;
- return copy_to_user((void*)arg, &sop, sizeof(sop));
+ ret = copy_to_user((void*)arg, &sop, sizeof(sop));
+ if (unlikely(ret)) {
+ crypto_finish_session(fcr, sop.ses);
+ return -EFAULT;
+ }
+ return ret;
case CIOCFSESSION:
get_user(ses, (uint32_t*)arg);
ret = crypto_finish_session(fcr, ses);
@@ -727,8 +732,13 @@ cryptodev_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
return ret;
session_op_to_compat(&sop, &compat_sop);
- return copy_to_user((void*)arg,
+ ret = copy_to_user((void*)arg,
&compat_sop, sizeof(compat_sop));
+ if (unlikely(ret)) {
+ crypto_finish_session(fcr, sop.ses);
+ return -EFAULT;
+ }
+ return ret;
case COMPAT_CIOCCRYPT:
ret = copy_from_user(&compat_cop,