mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2025-07-14 13:19:36 +02:00
af_unix: Read with MSG_PEEK loops if the first unread byte is OOB
[ Upstream commita6736a0add
] Read with MSG_PEEK flag loops if the first byte to read is an OOB byte. commit22dd70eb2c
("af_unix: Don't peek OOB data without MSG_OOB.") addresses the loop issue but does not address the issue that no data beyond OOB byte can be read. >>> from socket import * >>> c1, c2 = socketpair(AF_UNIX, SOCK_STREAM) >>> c1.send(b'a', MSG_OOB) 1 >>> c1.send(b'b') 1 >>> c2.recv(1, MSG_PEEK | MSG_DONTWAIT) b'b' >>> from socket import * >>> c1, c2 = socketpair(AF_UNIX, SOCK_STREAM) >>> c2.setsockopt(SOL_SOCKET, SO_OOBINLINE, 1) >>> c1.send(b'a', MSG_OOB) 1 >>> c1.send(b'b') 1 >>> c2.recv(1, MSG_PEEK | MSG_DONTWAIT) b'a' >>> c2.recv(1, MSG_PEEK | MSG_DONTWAIT) b'a' >>> c2.recv(1, MSG_DONTWAIT) b'a' >>> c2.recv(1, MSG_PEEK | MSG_DONTWAIT) b'b' >>> Fixes:314001f0bf
("af_unix: Add OOB support") Signed-off-by: Rao Shoaib <Rao.Shoaib@oracle.com> Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com> Link: https://lore.kernel.org/r/20240611084639.2248934-1-Rao.Shoaib@oracle.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
183ebc167a
commit
185c72f6b9
|
@ -2596,19 +2596,19 @@ static struct sk_buff *manage_oob(struct sk_buff *skb, struct sock *sk,
|
||||||
if (skb == u->oob_skb) {
|
if (skb == u->oob_skb) {
|
||||||
if (copied) {
|
if (copied) {
|
||||||
skb = NULL;
|
skb = NULL;
|
||||||
} else if (sock_flag(sk, SOCK_URGINLINE)) {
|
} else if (!(flags & MSG_PEEK)) {
|
||||||
if (!(flags & MSG_PEEK)) {
|
if (sock_flag(sk, SOCK_URGINLINE)) {
|
||||||
WRITE_ONCE(u->oob_skb, NULL);
|
WRITE_ONCE(u->oob_skb, NULL);
|
||||||
consume_skb(skb);
|
consume_skb(skb);
|
||||||
}
|
|
||||||
} else if (flags & MSG_PEEK) {
|
|
||||||
skb = NULL;
|
|
||||||
} else {
|
} else {
|
||||||
__skb_unlink(skb, &sk->sk_receive_queue);
|
__skb_unlink(skb, &sk->sk_receive_queue);
|
||||||
WRITE_ONCE(u->oob_skb, NULL);
|
WRITE_ONCE(u->oob_skb, NULL);
|
||||||
unlinked_skb = skb;
|
unlinked_skb = skb;
|
||||||
skb = skb_peek(&sk->sk_receive_queue);
|
skb = skb_peek(&sk->sk_receive_queue);
|
||||||
}
|
}
|
||||||
|
} else if (!sock_flag(sk, SOCK_URGINLINE)) {
|
||||||
|
skb = skb_peek_next(skb, &sk->sk_receive_queue);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock(&sk->sk_receive_queue.lock);
|
spin_unlock(&sk->sk_receive_queue.lock);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user