aboutsummaryrefslogtreecommitdiffstats
path: root/fs/pipe.c
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@suse.cz>2010-06-09 03:27:57 -0400
committerJens Axboe <jaxboe@fusionio.com>2010-06-10 13:08:34 -0400
commit6db40cf047a8723095caf79f5569d21b388d7b31 (patch)
treef1bb31671c39ef8cb990ee2c28ef34f7ce8a8aca /fs/pipe.c
parent1d862f41222b7f385bada9f85a67ca5592ffd33e (diff)
pipe: fix check in "set size" fcntl
As it stands this check compares the number of pages to the page size. This makes no sense and makes the fcntl fail in almost any sane case. Fix it by checking if nr_pages is not zero (it can become zero only if arg is too big and round_pipe_size() overflows). Signed-off-by: Miklos Szeredi <mszeredi@suse.cz> Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
Diffstat (limited to 'fs/pipe.c')
-rw-r--r--fs/pipe.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/fs/pipe.c b/fs/pipe.c
index f31e2d472984..279eef96c51c 100644
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -1215,12 +1215,13 @@ long pipe_fcntl(struct file *file, unsigned int cmd, unsigned long arg)
1215 size = round_pipe_size(arg); 1215 size = round_pipe_size(arg);
1216 nr_pages = size >> PAGE_SHIFT; 1216 nr_pages = size >> PAGE_SHIFT;
1217 1217
1218 ret = -EINVAL;
1219 if (!nr_pages)
1220 goto out;
1221
1218 if (!capable(CAP_SYS_RESOURCE) && size > pipe_max_size) { 1222 if (!capable(CAP_SYS_RESOURCE) && size > pipe_max_size) {
1219 ret = -EPERM; 1223 ret = -EPERM;
1220 goto out; 1224 goto out;
1221 } else if (nr_pages < PAGE_SIZE) {
1222 ret = -EINVAL;
1223 goto out;
1224 } 1225 }
1225 ret = pipe_set_size(pipe, nr_pages); 1226 ret = pipe_set_size(pipe, nr_pages);
1226 break; 1227 break;