On 03/07, K Prateek Nayak wrote: > > --- a/fs/pipe.c > +++ b/fs/pipe.c > @@ -1271,6 +1271,10 @@ int pipe_resize_ring(struct pipe_inode_info *pipe, unsigned int nr_slots) > struct pipe_buffer *bufs; > unsigned int head, tail, mask, n; > > + /* nr_slots larger than limits of pipe->{head,tail} */ > + if (unlikely(nr_slots > (pipe_index_t)-1u)) > + return -EINVAL; The whole series look "obviously" good to me, Reviewed-by: Oleg Nesterov <oleg@xxxxxxxxxx> ------------------------------------------------------------------------------- But damn ;) lets look at round_pipe_size(), unsigned int round_pipe_size(unsigned int size) { if (size > (1U << 31)) return 0; /* Minimum pipe size, as required by POSIX */ if (size < PAGE_SIZE) return PAGE_SIZE; return roundup_pow_of_two(size); } it is a bit silly to allow the maximum size == 1U << 31 in pipe_set_size() or (more importantly) in /proc/sys/fs/pipe-max-size, and then nack nr_slots in pipe_resize_ring(). So perhaps this check should go into round_pipe_size() ? Although I can't suggest a simple/clear check without unnecesary restrictions for the case when pipe_index_t is u16. pipe_resize_ring() has another caller, watch_queue_set_size(), but it has its own hard limits... Oleg.