• D
    pipe: Remove assertion from pipe_poll() · 8c7b8c34
    David Howells 提交于
    An assertion check was added to pipe_poll() to make sure that the ring
    occupancy isn't seen to overflow the ring size.  However, since no locks
    are held when the three values are read, it is possible for F_SETPIPE_SZ
    to intervene and muck up the calculation, thereby causing the oops.
    
    Fix this by simply removing the assertion and accepting that the
    calculation might be approximate.
    
    Note that the previous code also had a similar issue, though there was
    no assertion check, since the occupancy counter and the ring size were
    not read with a lock held, so it's possible that the poll check might
    have malfunctioned then too.
    
    Also wake up all the waiters so that they can reissue their checks if
    there was a competing read or write.
    
    Fixes: 8cefc107 ("pipe: Use head and tail pointers for the ring, not cursor and length")
    Reported-by: syzbot+d37abaade33a934f16f2@syzkaller.appspotmail.com
    Signed-off-by: NDavid Howells <dhowells@redhat.com>
    cc: Eric Biggers <ebiggers@kernel.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    8c7b8c34
pipe.c 28.9 KB