Message ID | 20250306113924.20004-2-kprateek.nayak@amd.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | pipe: Convert pipe->{head,tail} to unsigned short | expand |
On 03/06, K Prateek Nayak wrote: > > @@ -1272,6 +1272,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 > BIT(BITS_PER_TYPE(pipe_index_t) - 1))) Hmm, perhaps if (nr_slots > (pipe_index_t)-1u) is more clear? Oleg.
Hello Oleg, On 3/6/2025 5:58 PM, Oleg Nesterov wrote: > On 03/06, K Prateek Nayak wrote: >> >> @@ -1272,6 +1272,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 > BIT(BITS_PER_TYPE(pipe_index_t) - 1))) > > Hmm, perhaps > > if (nr_slots > (pipe_index_t)-1u) > > is more clear? Indeed it is. I didn't even know we could do that! Thank you for pointing it out. > > Oleg. >
diff --git a/fs/pipe.c b/fs/pipe.c index e8e6698f3698..3ca3103e1de7 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -1272,6 +1272,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 > BIT(BITS_PER_TYPE(pipe_index_t) - 1))) + return -EINVAL; + bufs = kcalloc(nr_slots, sizeof(*bufs), GFP_KERNEL_ACCOUNT | __GFP_NOWARN); if (unlikely(!bufs))
Limit the number of slots in pipe_resize_ring() to the maximum value representable by pipe->{head,tail}. Values beyond the max limit can lead to incorrect pipe_occupancy() calculations where the pipe will never appear full. Since nr_slots is always a power of 2 and the maximum size of pipe_index_t is 32 bits, BIT() is sufficient to represent the maximum value possible for nr_slots. Signed-off-by: K Prateek Nayak <kprateek.nayak@amd.com> --- fs/pipe.c | 4 ++++ 1 file changed, 4 insertions(+) base-commit: 848e076317446f9c663771ddec142d7c2eb4cb43