All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pablo Neira <pablo@eurodev.net>
To: Deti Fliegl <deti@fliegl.de>
Cc: netfilter-devel@lists.netfilter.org
Subject: Re: problem with conntrack utility and kernel 2.6.14
Date: Sat, 29 Oct 2005 20:35:57 +0200	[thread overview]
Message-ID: <4363C10D.3000903@eurodev.net> (raw)
In-Reply-To: <43639684.5030502@fliegl.de>

[-- Attachment #1: Type: text/plain, Size: 633 bytes --]

Deti Fliegl wrote:
> Pablo Neira wrote:
> 
>> Could you give a try to the patch attached and tell me if it fixes the 
>> problem as well?
> 
> Well - Houston, We Have a Problem :(
> 
> nfnl_parse_attr: deficit (4) len (0).

Damn, I'm not able to reproduce this on my x86 box. I tried by stressing 
the conntrack tool with the same method that you've previously described 
with no success, so this must be kind of x86_64 alignment issue.

Please, could you give a try to the patch attached and tell me if it 
fixes the problem? I've reworked the whole netlink message parsing function.

BTW, thanks for the responsiveness.

-- 
Pablo

[-- Attachment #2: x --]
[-- Type: text/plain, Size: 3596 bytes --]

Index: src/libnetfilter_conntrack.c
===================================================================
--- src/libnetfilter_conntrack.c	(revision 4398)
+++ src/libnetfilter_conntrack.c	(working copy)
@@ -431,66 +431,71 @@
 static int nfct_conntrack_netlink_handler(struct nfct_handle *cth, 
 					  struct nlmsghdr *nlh, void *arg)
 {
-	struct nfgenmsg *nfmsg;
-	struct nfattr *attr = NFM_NFA(NLMSG_DATA(nlh));
-	int attrlen = NLMSG_LENGTH(nlh->nlmsg_len) - NFNL_HEADER_LEN;
 	struct nfct_conntrack ct;
 	unsigned int flags = 0;
+	struct nfgenmsg *nfhdr = NLMSG_DATA(nlh);
 	int type = NFNL_MSG_TYPE(nlh->nlmsg_type), ret = 0;
+	int len = nlh->nlmsg_len;
+	struct nfattr *cda[CTA_MAX];
 
+	len -= NLMSG_LENGTH(sizeof(struct nfgenmsg));
+	if (len < 0)
+		return -EINVAL;
+
 	memset(&ct, 0, sizeof(struct nfct_conntrack));
 
-	nfmsg = NLMSG_DATA(nlh);
+	nfnl_parse_attr(cda, CTA_MAX, NFA_DATA(nfhdr), len);
 
-	if (NLMSG_LENGTH(nlh->nlmsg_len) < NFNL_HEADER_LEN)
-		return -EINVAL;
+	if (cda[CTA_TUPLE_ORIG-1])
+		parse_tuple(cda[CTA_TUPLE_ORIG-1], 
+			    &ct.tuple[NFCT_DIR_ORIGINAL]);
+	
+	if (cda[CTA_TUPLE_REPLY-1])
+		parse_tuple(cda[CTA_TUPLE_REPLY-1], 
+			    &ct.tuple[NFCT_DIR_REPLY]);
+	
+	if (cda[CTA_STATUS-1]) {
+		ct.status = ntohl(*(u_int32_t *)NFA_DATA(cda[CTA_STATUS-1]));
+		flags |= NFCT_STATUS;
+	}
 
-	while (NFA_OK(attr, attrlen)) {
-		switch(NFA_TYPE(attr)) {
-		case CTA_TUPLE_ORIG:
-			parse_tuple(attr, &ct.tuple[NFCT_DIR_ORIGINAL]);
-			break;
-		case CTA_TUPLE_REPLY:
-			parse_tuple(attr, &ct.tuple[NFCT_DIR_REPLY]);
-			break;
-		case CTA_STATUS:
-			ct.status = ntohl(*(u_int32_t *)NFA_DATA(attr));
-			flags |= NFCT_STATUS;
-			break;
-		case CTA_PROTOINFO:
-			parse_protoinfo(attr, &ct);
-			flags |= NFCT_PROTOINFO;
-			break;
-		case CTA_TIMEOUT:
-			ct.timeout = ntohl(*(u_int32_t *)NFA_DATA(attr));
-			flags |= NFCT_TIMEOUT;
-			break;
-		case CTA_MARK:
-			ct.mark = ntohl(*(u_int32_t *)NFA_DATA(attr));
-			flags |= NFCT_MARK;
-			break;
-		case CTA_COUNTERS_ORIG:
-			nfct_parse_counters(attr, &ct, NFA_TYPE(attr)-1);
-			flags |= NFCT_COUNTERS_ORIG;
-			break;
-		case CTA_COUNTERS_REPLY:
-			nfct_parse_counters(attr, &ct, NFA_TYPE(attr)-1);
-			flags |= NFCT_COUNTERS_RPLY;
-			break;
-		case CTA_USE:
-			ct.use = ntohl(*(u_int32_t *)NFA_DATA(attr));
-			flags |= NFCT_USE;
-			break;
-		case CTA_ID:
-			ct.id = ntohl(*(u_int32_t *)NFA_DATA(attr));
-			flags |= NFCT_ID;
-			break;
-		default:
-			fprintf(stderr, "Unknown Attribute %d\n", NFA_TYPE(attr));
-			break;
-		}
-		attr = NFA_NEXT(attr, attrlen);
+	if (cda[CTA_PROTOINFO-1]) {
+		parse_protoinfo(cda[CTA_PROTOINFO-1], &ct);
+		flags |= NFCT_PROTOINFO;
 	}
+
+	if (cda[CTA_TIMEOUT-1]) {
+		ct.timeout = ntohl(*(u_int32_t *)NFA_DATA(cda[CTA_TIMEOUT-1]));
+		flags |= NFCT_TIMEOUT;
+	}
+	
+	if (cda[CTA_MARK-1]) {
+		ct.mark = ntohl(*(u_int32_t *)NFA_DATA(cda[CTA_MARK-1]));
+		flags |= NFCT_MARK;
+	}
+	
+	if (cda[CTA_COUNTERS_ORIG-1]) {
+		nfct_parse_counters(cda[CTA_COUNTERS_ORIG-1], &ct, 
+				    NFA_TYPE(cda[CTA_COUNTERS_ORIG-1])-1);
+		flags |= NFCT_COUNTERS_ORIG;
+	}
+
+	if (cda[CTA_COUNTERS_REPLY-1]) {
+		nfct_parse_counters(cda[CTA_COUNTERS_REPLY-1], &ct, 
+				    NFA_TYPE(cda[CTA_COUNTERS_REPLY-1])-1);
+		flags |= NFCT_COUNTERS_RPLY;
+	}
+
+	if (cda[CTA_USE-1]) {
+		ct.use = ntohl(*(u_int32_t *)NFA_DATA(cda[CTA_USE-1]));
+		flags |= NFCT_USE;
+	}
+
+	if (cda[CTA_ID-1]) {
+		ct.id = ntohl(*(u_int32_t *)NFA_DATA(cda[CTA_ID-1]));
+		flags |= NFCT_ID;
+	}
+
 	if (cth->callback)
 		ret = cth->callback((void *) &ct, flags,
 				    typemsg2enum(type, nlh->nlmsg_flags));

  reply	other threads:[~2005-10-29 18:35 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-10-28  9:08 problem with conntrack utility and kernel 2.6.14 Deti Fliegl
2005-10-28  9:26 ` Pablo Neira
2005-10-28  9:26   ` Deti Fliegl
2005-10-28 10:01 ` Pablo Neira
2005-10-28 11:48   ` Deti Fliegl
2005-10-28 19:22     ` Pablo Neira
2005-10-28 19:53       ` Deti Fliegl
2005-10-29 13:06         ` Pablo Neira
2005-10-29 15:34           ` Deti Fliegl
2005-10-29 18:35             ` Pablo Neira [this message]
2005-10-29 15:44           ` Deti Fliegl
2005-10-31  4:41             ` Pablo Neira
2005-10-31  8:28               ` Krzysztof Oledzki
2005-11-01  1:09                 ` Pablo Neira
2005-11-01 10:29                   ` Krzysztof Oledzki
2005-11-01 13:55                     ` Pablo Neira
2005-11-01 15:17                       ` Krzysztof Oledzki
2005-11-01 16:39                         ` Pablo Neira
2005-11-01 18:49                           ` Krzysztof Oledzki
2005-11-01 19:27                             ` Pablo Neira
2005-11-01 19:39                               ` Krzysztof Oledzki
2005-11-01 20:07                             ` Pablo Neira
2005-11-01 20:21                               ` Krzysztof Oledzki
2005-11-02 16:04                                 ` Pablo Neira
2005-10-31 11:10               ` Deti Fliegl
2005-12-04  2:14         ` Pablo Neira Ayuso
2005-12-04 16:09           ` Patrick McHardy
2005-12-04 16:53             ` Deti Fliegl
2005-12-04 17:10           ` Yasuyuki KOZAKAI
2005-12-04 18:44             ` Deti Fliegl
2005-12-04 19:56               ` Patrick McHardy
2005-12-05  5:51                 ` Yasuyuki KOZAKAI
2005-12-15 12:49               ` problem with conntrack utility and kernel 2.6.14 - still with 2.6.14.4 Deti Fliegl
2005-12-15 13:05                 ` Pablo Neira Ayuso
2005-12-15 17:21                 ` Krzysztof Oledzki
     [not found]           ` <200512041004.37192.romary@nikoon.com>
2005-12-04 20:04             ` Major problem with conntrack utility and kernel 2.6.14.3 Patrick McHardy
2005-12-04 23:08               ` Deti Fliegl
2005-12-05 10:24               ` Krzysztof Oledzki
2005-12-05 15:17                 ` Patrick McHardy
2005-10-28 13:39   ` problem with conntrack utility and kernel 2.6.14 Deti Fliegl

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=4363C10D.3000903@eurodev.net \
    --to=pablo@eurodev.net \
    --cc=deti@fliegl.de \
    --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.