|
@@ -613,6 +613,11 @@ static bool too_many_pipe_buffers_hard(unsigned long user_bufs)
|
|
|
return pipe_user_pages_hard && user_bufs >= pipe_user_pages_hard;
|
|
|
}
|
|
|
|
|
|
+static bool is_unprivileged_user(void)
|
|
|
+{
|
|
|
+ return !capable(CAP_SYS_RESOURCE) && !capable(CAP_SYS_ADMIN);
|
|
|
+}
|
|
|
+
|
|
|
struct pipe_inode_info *alloc_pipe_info(void)
|
|
|
{
|
|
|
struct pipe_inode_info *pipe;
|
|
@@ -629,12 +634,12 @@ struct pipe_inode_info *alloc_pipe_info(void)
|
|
|
|
|
|
user_bufs = account_pipe_buffers(user, 0, pipe_bufs);
|
|
|
|
|
|
- if (too_many_pipe_buffers_soft(user_bufs)) {
|
|
|
+ if (too_many_pipe_buffers_soft(user_bufs) && is_unprivileged_user()) {
|
|
|
user_bufs = account_pipe_buffers(user, pipe_bufs, 1);
|
|
|
pipe_bufs = 1;
|
|
|
}
|
|
|
|
|
|
- if (too_many_pipe_buffers_hard(user_bufs))
|
|
|
+ if (too_many_pipe_buffers_hard(user_bufs) && is_unprivileged_user())
|
|
|
goto out_revert_acct;
|
|
|
|
|
|
pipe->bufs = kcalloc(pipe_bufs, sizeof(struct pipe_buffer),
|
|
@@ -1065,7 +1070,7 @@ static long pipe_set_size(struct pipe_inode_info *pipe, unsigned long arg)
|
|
|
if (nr_pages > pipe->buffers &&
|
|
|
(too_many_pipe_buffers_hard(user_bufs) ||
|
|
|
too_many_pipe_buffers_soft(user_bufs)) &&
|
|
|
- !capable(CAP_SYS_RESOURCE) && !capable(CAP_SYS_ADMIN)) {
|
|
|
+ is_unprivileged_user()) {
|
|
|
ret = -EPERM;
|
|
|
goto out_revert_acct;
|
|
|
}
|