From: Pablo Neira Ayuso <pablo@netfilter.org>
To: rui.sousa@mindspeed.com
Cc: netfilter-devel@vger.kernel.org
Subject: Re: TCP proto info
Date: Fri, 03 Sep 2010 13:33:52 +0200 [thread overview]
Message-ID: <4C80DD20.7010004@netfilter.org> (raw)
In-Reply-To: <OF4265BCAA.61F095B7-ONC1257792.0032E48D-C1257792.00337F58@mindspeed.com>
[-- Attachment #1: Type: text/plain, Size: 1213 bytes --]
On 02/09/10 11:21, rui.sousa@mindspeed.com wrote:
> Pablo Neira Ayuso <pablo@netfilter.org> wrote on 09/02/2010 10:57:39 AM:
>
>> Hi Rui,
>
> Hi Pablo,
>
>> On 01/09/10 15:45, rui.sousa@mindspeed.com wrote:
>>> Hi,
>>>
>>> I have an application using libnetfilter_conntrack-0.100 that started
>>> reporting errors after the commit:
>>>
>>> 1c450e1595afdc8d1bfabb4f640c9251808426eb.
>>
>> Looking at the source code, this seems to be already fixed in
>> libnetfilter_conntrack 0.0.102, please upgrade to latest.
>
> Hmm... looking at the git tree I see that the __build_conntrack() code is
> still calling __build_protoinfo() unconditionally and inside the function
> we always do:
>
> nest = nfnl_nest(&req->nlh, size, CTA_PROTOINFO);
> nest_proto = nfnl_nest(&req->nlh, size, CTA_PROTOINFO_TCP);
> ...
> nfnl_nest_end(&req->nlh, nest_proto);
> nfnl_nest_end(&req->nlh, nest);
>
> even if none of the ATTR_TCP_xxx bits are set. This is what causes the
> kernel to return -EINVAL
> and ignore the conntrack update. Or am I missing something?
I see, I guess that you're using a Linux kernel <= 2.6.25 since I
couldn't reproduce it with recent kernels. Please, could you give a try
to the following patch?
[-- Attachment #2: fix.patch --]
[-- Type: text/x-patch, Size: 2516 bytes --]
ct: fix EINVAL if not TCP attributes are set for Linux kernel <= 2.6.25
This patch fixes an EINVAL error that we hit in Linux kernel <= 2.6.25.
Basically, if we send an empty CTA_PROTOINFO_TCP attribute nest, the
kernel returns EINVAL. To fix this, we previously check if there is
any TCP attribute set.
Reported-by: Rui Sousa <rui.sousa@mindspeed.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
src/conntrack/build.c | 24 ++++++++++++++++++++++++
1 files changed, 24 insertions(+), 0 deletions(-)
diff --git a/src/conntrack/build.c b/src/conntrack/build.c
index b878ddd..ec7623d 100644
--- a/src/conntrack/build.c
+++ b/src/conntrack/build.c
@@ -106,6 +106,18 @@ static void __build_protoinfo(struct nfnlhdr *req, size_t size,
switch(ct->tuple[__DIR_ORIG].protonum) {
case IPPROTO_TCP:
+ /* Preliminary attribute check to avoid sending an empty
+ * CTA_PROTOINFO_TCP nest, which results in EINVAL in
+ * Linux kernel <= 2.6.25. */
+ if (!(test_bit(ATTR_TCP_STATE, ct->set) ||
+ test_bit(ATTR_TCP_FLAGS_ORIG, ct->set) ||
+ test_bit(ATTR_TCP_FLAGS_REPL, ct->set) ||
+ test_bit(ATTR_TCP_MASK_ORIG, ct->set) ||
+ test_bit(ATTR_TCP_MASK_REPL, ct->set) ||
+ test_bit(ATTR_TCP_WSCALE_ORIG, ct->set) ||
+ test_bit(ATTR_TCP_WSCALE_REPL, ct->set))) {
+ break;
+ }
nest = nfnl_nest(&req->nlh, size, CTA_PROTOINFO);
nest_proto = nfnl_nest(&req->nlh, size, CTA_PROTOINFO_TCP);
if (test_bit(ATTR_TCP_STATE, ct->set))
@@ -139,6 +151,12 @@ static void __build_protoinfo(struct nfnlhdr *req, size_t size,
nfnl_nest_end(&req->nlh, nest);
break;
case IPPROTO_SCTP:
+ /* See comment above on TCP. */
+ if (!(test_bit(ATTR_SCTP_STATE, ct->set) ||
+ test_bit(ATTR_SCTP_VTAG_ORIG, ct->set) ||
+ test_bit(ATTR_SCTP_VTAG_REPL, ct->set))) {
+ break;
+ }
nest = nfnl_nest(&req->nlh, size, CTA_PROTOINFO);
nest_proto = nfnl_nest(&req->nlh, size, CTA_PROTOINFO_SCTP);
if (test_bit(ATTR_SCTP_STATE, ct->set))
@@ -158,6 +176,12 @@ static void __build_protoinfo(struct nfnlhdr *req, size_t size,
nfnl_nest_end(&req->nlh, nest);
break;
case IPPROTO_DCCP:
+ /* See comment above on TCP. */
+ if (!(test_bit(ATTR_DCCP_STATE, ct->set) ||
+ test_bit(ATTR_DCCP_ROLE, ct->set) ||
+ test_bit(ATTR_DCCP_HANDSHAKE_SEQ, ct->set))) {
+ break;
+ }
nest = nfnl_nest(&req->nlh, size, CTA_PROTOINFO);
nest_proto = nfnl_nest(&req->nlh, size, CTA_PROTOINFO_DCCP);
if (test_bit(ATTR_DCCP_STATE, ct->set))
next prev parent reply other threads:[~2010-09-03 11:34 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-01 13:45 TCP proto info rui.sousa
2010-09-02 8:57 ` Pablo Neira Ayuso
2010-09-02 9:21 ` rui.sousa
2010-09-03 11:33 ` Pablo Neira Ayuso [this message]
-- strict thread matches above, loose matches on Subject: below --
2010-09-06 16:10 rui.sousa
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=4C80DD20.7010004@netfilter.org \
--to=pablo@netfilter.org \
--cc=netfilter-devel@vger.kernel.org \
--cc=rui.sousa@mindspeed.com \
/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.