• Kuniyuki Iwashima's avatar
    af_unix: Stop recv(MSG_PEEK) at consumed OOB skb. · b94038d8
    Kuniyuki Iwashima authored
    After consuming OOB data, recv() reading the preceding data must break at
    the OOB skb regardless of MSG_PEEK.
    
    Currently, MSG_PEEK does not stop recv() for AF_UNIX, and the behaviour is
    not compliant with TCP.
    
      >>> from socket import *
      >>> c1, c2 = socketpair(AF_UNIX)
      >>> c1.send(b'hello', MSG_OOB)
      5
      >>> c1.send(b'world')
      5
      >>> c2.recv(1, MSG_OOB)
      b'o'
      >>> c2.recv(9, MSG_PEEK)  # This should return b'hell'
      b'hellworld'              # even with enough buffer.
    
    Let's fix it by returning NULL for consumed skb and unlinking it only if
    MSG_PEEK is not specified.
    
    This patch also adds test cases that add recv(MSG_PEEK) before each recv().
    
    Without fix:
    
      #  RUN           msg_oob.peek.oob_ahead_break ...
      # msg_oob.c:134:oob_ahead_break:AF_UNIX :hellworld
      # msg_oob.c:135:oob_ahead_break:Expected:hell
      # msg_oob.c:137:oob_ahead_break:Expected ret[0] (9) == expected_len (4)
      # oob_ahead_break: Test terminated by assertion
      #          FAIL  msg_oob.peek.oob_ahead_break
      not ok 13 msg_oob.peek.oob_ahead_break
    
    With fix:
    
      #  RUN           msg_oob.peek.oob_ahead_break ...
      #            OK  msg_oob.peek.oob_ahead_break
      ok 13 msg_oob.peek.oob_ahead_break
    
    Fixes: 314001f0 ("af_unix: Add OOB support")
    Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
    Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    b94038d8
af_unix.c 86.9 KB