Skip to content

Commit 96a4d89

Browse files
dhowellstorvalds
authored andcommitted
watch_queue: Fix to always request a pow-of-2 pipe ring size
The pipe ring size must always be a power of 2 as the head and tail pointers are masked off by AND'ing with the size of the ring - 1. watch_queue_set_size(), however, lets you specify any number of notes between 1 and 511. This number is passed through to pipe_resize_ring() without checking/forcing its alignment. Fix this by rounding the number of slots required up to the nearest power of two. The request is meant to guarantee that at least that many notifications can be generated before the queue is full, so rounding down isn't an option, but, alternatively, it may be better to give an error if we aren't allowed to allocate that much ring space. Fixes: c73be61 ("pipe: Add general notification queue support") Reported-by: Jann Horn <jannh@google.com> Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent c1853fb commit 96a4d89

1 file changed

Lines changed: 1 addition & 1 deletion

File tree

kernel/watch_queue.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ long watch_queue_set_size(struct pipe_inode_info *pipe, unsigned int nr_notes)
244244
goto error;
245245
}
246246

247-
ret = pipe_resize_ring(pipe, nr_notes);
247+
ret = pipe_resize_ring(pipe, roundup_pow_of_two(nr_notes));
248248
if (ret < 0)
249249
goto error;
250250

0 commit comments

Comments
 (0)