gadget/function/f_fs.c: close leaks
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 1 Feb 2015 04:42:34 +0000 (23:42 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 18 Feb 2015 03:23:28 +0000 (22:23 -0500)
If ffs_epfile_io() fails in AIO case, we end up leaking io_data
(and iovec_copy in case of AIO read).

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
drivers/usb/gadget/function/f_fs.c

index af98b096af2fde060aea8978005e8ea620762566..3ab34a2075dfc9263c2d14b21d9292aeb9aba826 100644 (file)
@@ -970,6 +970,7 @@ static ssize_t ffs_epfile_aio_write(struct kiocb *kiocb,
                                    unsigned long nr_segs, loff_t loff)
 {
        struct ffs_io_data *io_data;
+       ssize_t res;
 
        ENTER();
 
@@ -989,7 +990,10 @@ static ssize_t ffs_epfile_aio_write(struct kiocb *kiocb,
 
        kiocb_set_cancel_fn(kiocb, ffs_aio_cancel);
 
-       return ffs_epfile_io(kiocb->ki_filp, io_data);
+       res = ffs_epfile_io(kiocb->ki_filp, io_data);
+       if (res != -EIOCBQUEUED)
+               kfree(io_data);
+       return res;
 }
 
 static ssize_t ffs_epfile_aio_read(struct kiocb *kiocb,
@@ -998,6 +1002,7 @@ static ssize_t ffs_epfile_aio_read(struct kiocb *kiocb,
 {
        struct ffs_io_data *io_data;
        struct iovec *iovec_copy;
+       ssize_t res;
 
        ENTER();
 
@@ -1025,7 +1030,12 @@ static ssize_t ffs_epfile_aio_read(struct kiocb *kiocb,
 
        kiocb_set_cancel_fn(kiocb, ffs_aio_cancel);
 
-       return ffs_epfile_io(kiocb->ki_filp, io_data);
+       res = ffs_epfile_io(kiocb->ki_filp, io_data);
+       if (res != -EIOCBQUEUED) {
+               kfree(io_data);
+               kfree(iovec_copy);
+       }
+       return res;
 }
 
 static int