Message ID | 1404167704-22408-1-git-send-email-blp@nicira.com |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
From: Ben Pfaff <blp@nicira.com> Date: Mon, 30 Jun 2014 15:35:04 -0700 > 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, commit b44d211 (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 > > Signed-off-by: Ben Pfaff <blp@nicira.com> There's another place, later in this file, doing the same exact thing. Please respin this patch, fixing that location too. Thanks. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Mon, Jul 07, 2014 at 07:37:35PM -0700, David Miller wrote: > From: Ben Pfaff <blp@nicira.com> > Date: Mon, 30 Jun 2014 15:35:04 -0700 > > > 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, commit b44d211 (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 > > > > Signed-off-by: Ben Pfaff <blp@nicira.com> > > There's another place, later in this file, doing the same exact thing. > > Please respin this patch, fixing that location too. Thanks for pointing that out, I sent out v2. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 15c731f..b7514b3 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -2483,7 +2483,7 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock, 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); } }
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, commit b44d211 (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 Signed-off-by: Ben Pfaff <blp@nicira.com> --- net/netlink/af_netlink.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)