summaryrefslogtreecommitdiff
path: root/fs/exofs
diff options
context:
space:
mode:
authorBoaz Harrosh <bharrosh@panasas.com>2012-11-30 16:03:31 +0200
committerBoaz Harrosh <bharrosh@panasas.com>2012-12-14 12:17:32 +0200
commit861d66601acda6d7a2038fb3c95f68009128003a (patch)
tree5d0c9ede684df2d9788bde18129354fe4736bcad /fs/exofs
parentaf402ab2b0369c2b1acf4cde72c5ed5050c74e5b (diff)
downloadlinux-exynos-861d66601acda6d7a2038fb3c95f68009128003a.tar.gz
linux-exynos-861d66601acda6d7a2038fb3c95f68009128003a.tar.bz2
linux-exynos-861d66601acda6d7a2038fb3c95f68009128003a.zip
exofs: don't leak io_state and pages on read error
Same bug as fixed by Idan for write_exec was in read_exec. Fix the io_state leak and pages state on read error. Also while at it: The if (!pcol->read_4_write) at the error path is redundant because all goto err; are after the if (pcol->read_4_write) bale out. Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Diffstat (limited to 'fs/exofs')
-rw-r--r--fs/exofs/inode.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/fs/exofs/inode.c b/fs/exofs/inode.c
index 1634b946565f..d1f80abd8828 100644
--- a/fs/exofs/inode.c
+++ b/fs/exofs/inode.c
@@ -361,12 +361,12 @@ static int read_exec(struct page_collect *pcol)
return 0;
err:
- if (!pcol->read_4_write)
- _unlock_pcol_pages(pcol, ret, READ);
-
- pcol_free(pcol);
-
+ if (!pcol_copy) /* Failed before ownership transfer */
+ pcol_copy = pcol;
+ _unlock_pcol_pages(pcol_copy, ret, READ);
+ pcol_free(pcol_copy);
kfree(pcol_copy);
+
return ret;
}