]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fs/pipe: Fix pipe_occupancy() with 16-bit indexes
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 5 Mar 2025 17:08:09 +0000 (07:08 -1000)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 5 Mar 2025 17:08:09 +0000 (07:08 -1000)
The pipe_occupancy() logic implicitly relied on the natural unsigned
modulo arithmetic in C, but that doesn't work for the new 'pipe_index_t'
case, since any arithmetic will be done in 'int' (and here we had also
made it 'unsigned int' due to the function call boundary).

So make the modulo arithmetic explicit by casting the result to the
proper type.

Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Mateusz Guzik <mjguzik@gmail.com>
Cc: Manfred Spraul <manfred@colorfullife.com>
Cc: Christian Brauner <brauner@kernel.org>
Cc: Swapnil Sapkal <swapnil.sapkal@amd.com>
Cc: Alexey Gladkov <legion@kernel.org>
Cc: K Prateek Nayak <kprateek.nayak@amd.com>
Link: https://lore.kernel.org/all/CAHk-=wjyHsGLx=rxg6PKYBNkPYAejgo7=CbyL3=HGLZLsAaJFQ@mail.gmail.com/
Fixes: 3d252160b818 ("fs/pipe: Read pipe->{head,tail} atomically outside pipe->mutex")
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/linux/pipe_fs_i.h

index 3cc4f8eab853f3c169a017311250e01d58cc8e89..1f013ed7577ef642ecab2449c11a0a14a3b25ae0 100644 (file)
@@ -192,7 +192,7 @@ static inline bool pipe_empty(unsigned int head, unsigned int tail)
  */
 static inline unsigned int pipe_occupancy(unsigned int head, unsigned int tail)
 {
-       return head - tail;
+       return (pipe_index_t)(head - tail);
 }
 
 /**