From: Pablo Neira Ayuso <pablo@netfilter.org>
To: netfilter-devel <netfilter-devel@lists.netfilter.org>,
netdev@vger.kernel.org, LKML <linux-kernel@vger.kernel.org>
Cc: "David S. Miller" <davem@davemloft.net>
Subject: Re: ctnetlink loop
Date: Thu, 09 Dec 2010 11:56:13 +0100 [thread overview]
Message-ID: <4D00B5CD.3050406@netfilter.org> (raw)
In-Reply-To: <20101203133903.GG13225@mail.eitzenberger.org>
[-- Attachment #1: Type: text/plain, Size: 1298 bytes --]
Sorry, I finally found your email reporting this:
> nfnetlink: avoid unbound loop on busy Netlink socket
>
> I see a problem with how ctnetlink GET requests are being
> processed in the kernel (2.6.32.24) under high load.
>
> The sympton is Netlink looping around nfnetlink_rcv_msg(), which
> is just because netlink_unicast() came back with EAGAIN when
> trying to write the newly created Netlink skb to the SK receive
> buffer in ctnetlink_get_conntrack(). In this case a (possibly)
> infinit loop is entered. Mostly infinit I think in case the
> userland party trying to receive those messages may be stuck in
> the sendmsg() call, being unable to read anything if being single
> threaded.
>
> I tried to reproduce several times, a few times the loop
> disappeared and the box proceeded normally after some minutes.
> I have no explanation for this.
>
> The attached patch tries to solve it by simple not trying again
> to netlink_unicast() the reply skb and just fail with -ENOBUFS.
> The reasoning is that at the point a Netlink overrun is detected
> it seems counter intuitive to insist on sending one more Netlink
> message.
We still need EAGAIN, and it doesn't necessarily means ENOBUFS for the
general case in nfnetlink.
The following patch covers the case that you're reporting.
[-- Attachment #2: f.patch --]
[-- Type: text/x-patch, Size: 1164 bytes --]
netfilter: ctnetlink: fix loop in ctnetlink_get_conntrack()
From: Pablo Neira Ayuso <pablo@netfilter.org>
This patch fixes a loop in ctnetlink_get_conntrack() that can be
triggered if you use the same socket to receive events and to
perform a GET operation. Under heavy load, netlink_unicast()
may return -EAGAIN, this error code is reserved in nfnetlink for
the module load-on-demand. Instead, we return -ENOBUFS which is
the appropriate error code that has to be propagated to
user-space.
Reported-by: Holger Eitzenberger <holger@eitzenberger.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
net/netfilter/nf_conntrack_netlink.c | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c
index b729ace..a84fa6f 100644
--- a/net/netfilter/nf_conntrack_netlink.c
+++ b/net/netfilter/nf_conntrack_netlink.c
@@ -973,7 +973,8 @@ ctnetlink_get_conntrack(struct sock *ctnl, struct sk_buff *skb,
free:
kfree_skb(skb2);
out:
- return err;
+ /* this avoids a loop in nfnetlink. */
+ return err == -EAGAIN ? -ENOBUFS : err;
}
#ifdef CONFIG_NF_NAT_NEEDED
next prev parent reply other threads:[~2010-12-09 11:02 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-03 13:39 ctnetlink loop Holger Eitzenberger
2010-12-03 13:58 ` Holger Eitzenberger
2010-12-09 10:56 ` Pablo Neira Ayuso [this message]
2010-12-09 15:23 ` Holger Eitzenberger
2010-12-10 22:01 ` David Miller
-- strict thread matches above, loose matches on Subject: below --
2010-12-08 17:50 David Miller
2010-12-08 20:31 ` Holger Eitzenberger
2010-12-09 10:39 ` Pablo Neira Ayuso
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4D00B5CD.3050406@netfilter.org \
--to=pablo@netfilter.org \
--cc=davem@davemloft.net \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=netfilter-devel@lists.netfilter.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.