netlink: Fix handling of error from netlink_dump().
[ Upstream commit ac30ef832e6af0505b6f0251a6659adcfa74975e ] netlink_dump() returns a negative errno value on error. Until now, netlink_recvmsg() directly recorded that negative value in sk->sk_err, but that's wrong since sk_err takes positive errno values. (This manifests as userspace receiving a positive return value from the recv() system call, falsely indicating success.) This bug was introduced in the commit that started checking the netlink_dump() return value, commitb44d211
(netlink: handle errors from netlink_dump()). Multithreaded Netlink dumps are one way to trigger this behavior in practice, as described in the commit message for the userspace workaround posted here: http://openvswitch.org/pipermail/dev/2014-June/042339.html This commit also fixes the same bug in netlink_poll(), introduced in commitcd1df525d
(netlink: add flow control for memory mapped I/O). Signed-off-by: Ben Pfaff <blp@nicira.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
ba502e1e23
commit
c29503e9c0
|
@ -500,7 +500,7 @@ static unsigned int netlink_poll(struct file *file, struct socket *sock,
|
|||
while (nlk->cb != NULL && netlink_dump_space(nlk)) {
|
||||
err = netlink_dump(sk);
|
||||
if (err < 0) {
|
||||
sk->sk_err = err;
|
||||
sk->sk_err = -err;
|
||||
sk->sk_error_report(sk);
|
||||
break;
|
||||
}
|
||||
|
@ -2272,7 +2272,7 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,
|
|||
if (nlk->cb && atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf / 2) {
|
||||
ret = netlink_dump(sk);
|
||||
if (ret) {
|
||||
sk->sk_err = ret;
|
||||
sk->sk_err = -ret;
|
||||
sk->sk_error_report(sk);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue