nfq: replace nfnl_talk by nfnl_query and disable sequence tracking
authorPablo Neira Ayuso <pablo@netfilter.org>
Tue, 17 Feb 2009 19:47:21 +0000 (20:47 +0100)
committerr.kubiak <r.kubiak@samsung.com>
Mon, 16 Nov 2015 13:12:05 +0000 (14:12 +0100)
This patch replaces the nfnl_talk() calls by the newer nfnl_query().
This patch also disables netlink sequence tracking by default.
Spurious race conditions in the sequence tracking may occur while
creating queues and receiving high load of packets at the same time.

Reported-by: Anton Vazir <anton.vazir@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
configure.in
src/libnetfilter_queue.c

index d3ce4a029b08cefa53370d8326af23cdfc82abc8..15e03a1f917e5670ba36aa24745db8bf43fd621c 100644 (file)
@@ -18,7 +18,7 @@ case $target in
 esac
 
 dnl Dependencies
-LIBNFNETLINK_REQUIRED=0.0.38
+LIBNFNETLINK_REQUIRED=0.0.41
  
 PKG_CHECK_MODULES(LIBNFNETLINK, libnfnetlink >= $LIBNFNETLINK_REQUIRED,,
        AC_MSG_ERROR(Cannot find libnfnetlink >= $LIBNFNETLINK_REQUIRED))
index 9e4903b642a3bc3bde4135361da4460ddb65396c..a2d0de23bde4f217c5ff70e949406db70d7ab6da 100644 (file)
@@ -141,7 +141,7 @@ __build_send_cfg_msg(struct nfq_handle *h, u_int8_t command,
        cmd.pf = htons(pf);
        nfnl_addattr_l(&u.nmh, sizeof(u), NFQA_CFG_CMD, &cmd, sizeof(cmd));
 
-       return nfnl_talk(h->nfnlh, &u.nmh, 0, 0, NULL, NULL, NULL);
+       return nfnl_query(h->nfnlh, &u.nmh);
 }
 
 static int __nfq_rcv_pkt(struct nlmsghdr *nlh, struct nfattr *nfa[],
@@ -295,6 +295,9 @@ struct nfq_handle *nfq_open(void)
        if (!nfnlh)
                return NULL;
 
+       /* unset netlink sequence tracking by default */
+       nfnl_unset_sequence_tracking(nfnlh);
+
        qh = nfq_open_nfnl(nfnlh);
        if (!qh)
                nfnl_close(nfnlh);
@@ -553,7 +556,7 @@ int nfq_set_mode(struct nfq_q_handle *qh,
        nfnl_addattr_l(&u.nmh, sizeof(u), NFQA_CFG_PARAMS, &params,
                        sizeof(params));
 
-       return nfnl_talk(qh->h->nfnlh, &u.nmh, 0, 0, NULL, NULL, NULL);
+       return nfnl_query(qh->h->nfnlh, &u.nmh);
 }
 
 /**
@@ -581,7 +584,7 @@ int nfq_set_queue_maxlen(struct nfq_q_handle *qh,
        nfnl_addattr_l(&u.nmh, sizeof(u), NFQA_CFG_QUEUE_MAXLEN, &queue_maxlen,
                        sizeof(queue_maxlen));
 
-       return nfnl_talk(qh->h->nfnlh, &u.nmh, 0, 0, NULL, NULL, NULL);
+       return nfnl_query(qh->h->nfnlh, &u.nmh);
 }
 
 /**