diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2015-01-31 23:42:34 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2015-02-17 22:23:28 -0500 |
commit | de2080d41b5d584205e408d72021f0f335a046fc (patch) | |
tree | e67c086dd0488609e70f1c9eb9c43c30950d0355 | |
parent | d879cb83417a71c435f1263e1160a9fce8e95d87 (diff) |
gadget/function/f_fs.c: close leaks
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>
-rw-r--r-- | drivers/usb/gadget/function/f_fs.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index af98b096af2f..3ab34a2075df 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c | |||
@@ -970,6 +970,7 @@ static ssize_t ffs_epfile_aio_write(struct kiocb *kiocb, | |||
970 | unsigned long nr_segs, loff_t loff) | 970 | unsigned long nr_segs, loff_t loff) |
971 | { | 971 | { |
972 | struct ffs_io_data *io_data; | 972 | struct ffs_io_data *io_data; |
973 | ssize_t res; | ||
973 | 974 | ||
974 | ENTER(); | 975 | ENTER(); |
975 | 976 | ||
@@ -989,7 +990,10 @@ static ssize_t ffs_epfile_aio_write(struct kiocb *kiocb, | |||
989 | 990 | ||
990 | kiocb_set_cancel_fn(kiocb, ffs_aio_cancel); | 991 | kiocb_set_cancel_fn(kiocb, ffs_aio_cancel); |
991 | 992 | ||
992 | return ffs_epfile_io(kiocb->ki_filp, io_data); | 993 | res = ffs_epfile_io(kiocb->ki_filp, io_data); |
994 | if (res != -EIOCBQUEUED) | ||
995 | kfree(io_data); | ||
996 | return res; | ||
993 | } | 997 | } |
994 | 998 | ||
995 | static ssize_t ffs_epfile_aio_read(struct kiocb *kiocb, | 999 | static ssize_t ffs_epfile_aio_read(struct kiocb *kiocb, |
@@ -998,6 +1002,7 @@ static ssize_t ffs_epfile_aio_read(struct kiocb *kiocb, | |||
998 | { | 1002 | { |
999 | struct ffs_io_data *io_data; | 1003 | struct ffs_io_data *io_data; |
1000 | struct iovec *iovec_copy; | 1004 | struct iovec *iovec_copy; |
1005 | ssize_t res; | ||
1001 | 1006 | ||
1002 | ENTER(); | 1007 | ENTER(); |
1003 | 1008 | ||
@@ -1025,7 +1030,12 @@ static ssize_t ffs_epfile_aio_read(struct kiocb *kiocb, | |||
1025 | 1030 | ||
1026 | kiocb_set_cancel_fn(kiocb, ffs_aio_cancel); | 1031 | kiocb_set_cancel_fn(kiocb, ffs_aio_cancel); |
1027 | 1032 | ||
1028 | return ffs_epfile_io(kiocb->ki_filp, io_data); | 1033 | res = ffs_epfile_io(kiocb->ki_filp, io_data); |
1034 | if (res != -EIOCBQUEUED) { | ||
1035 | kfree(io_data); | ||
1036 | kfree(iovec_copy); | ||
1037 | } | ||
1038 | return res; | ||
1029 | } | 1039 | } |
1030 | 1040 | ||
1031 | static int | 1041 | static int |