• Kuniyuki Iwashima's avatar
    af_unix: Don't peek OOB data without MSG_OOB. · 22dd70eb
    Kuniyuki Iwashima authored
    Currently, we can read OOB data without MSG_OOB by using MSG_PEEK
    when OOB data is sitting on the front row, which is apparently
    wrong.
    
      >>> from socket import *
      >>> c1, c2 = socketpair(AF_UNIX, SOCK_STREAM)
      >>> c1.send(b'a', MSG_OOB)
      1
      >>> c2.recv(1, MSG_PEEK | MSG_DONTWAIT)
      b'a'
    
    If manage_oob() is called when no data has been copied, we only
    check if the socket enables SO_OOBINLINE or MSG_PEEK is not used.
    Otherwise, the skb is returned as is.
    
    However, here we should return NULL if MSG_PEEK is set and no data
    has been copied.
    
    Also, in such a case, we should not jump to the redo label because
    we will be caught in the loop and hog the CPU until normal data
    comes in.
    
    Then, we need to handle skb == NULL case with the if-clause below
    the manage_oob() block.
    
    With this patch:
    
      >>> from socket import *
      >>> c1, c2 = socketpair(AF_UNIX, SOCK_STREAM)
      >>> c1.send(b'a', MSG_OOB)
      1
      >>> c2.recv(1, MSG_PEEK | MSG_DONTWAIT)
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      BlockingIOError: [Errno 11] Resource temporarily unavailable
    
    Fixes: 314001f0 ("af_unix: Add OOB support")
    Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
    Link: https://lore.kernel.org/r/20240410171016.7621-3-kuniyu@amazon.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    22dd70eb
af_unix.c 88.2 KB