socket: skip checking sk_err for recvmmsg(MSG_ERRQUEUE)
recvmmsg does not call ___sys_recvmsg when sk_err is set. That is fine for normal reads but, for MSG_ERRQUEUE, recvmmsg should always call ___sys_recvmsg regardless of sk->sk_err to be able to clear error queue. Otherwise, users are not able to drain the error queue using recvmmsg. Signed-off-by: Soheil Hassas Yeganeh <soheil@google.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Signed-off-by: Willem de Bruijn <willemb@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
96dbdc5d8c
commit
7797dc4141
10
net/socket.c
10
net/socket.c
|
@ -2289,10 +2289,12 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
|
||||||
if (!sock)
|
if (!sock)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
err = sock_error(sock->sk);
|
if (likely(!(flags & MSG_ERRQUEUE))) {
|
||||||
if (err) {
|
err = sock_error(sock->sk);
|
||||||
datagrams = err;
|
if (err) {
|
||||||
goto out_put;
|
datagrams = err;
|
||||||
|
goto out_put;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
entry = mmsg;
|
entry = mmsg;
|
||||||
|
|
Loading…
Reference in New Issue