]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
netfilter: ctnetlink: fix reliable event delivery if message building fails
authorPablo Neira Ayuso <pablo@netfilter.org>
Tue, 30 Mar 2010 04:28:23 +0000 (21:28 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 1 Apr 2010 23:02:09 +0000 (16:02 -0700)
[ Upstream commit 37b7ef7203240b3aba577bb1ff6765fe15225976 ]

This patch fixes a bug that allows to lose events when reliable
event delivery mode is used, ie. if NETLINK_BROADCAST_SEND_ERROR
and NETLINK_RECV_NO_ENOBUFS socket options are set.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
include/linux/netfilter/nfnetlink.h
net/netfilter/nf_conntrack_netlink.c
net/netfilter/nfnetlink.c

index 49d321f3ccd2628fc9ce4721eb4650209e5df8a1..264d83dbedfb2598f28319b0dfc84f117f7a10d0 100644 (file)
@@ -76,7 +76,7 @@ extern int nfnetlink_subsys_unregister(const struct nfnetlink_subsystem *n);
 extern int nfnetlink_has_listeners(unsigned int group);
 extern int nfnetlink_send(struct sk_buff *skb, u32 pid, unsigned group, 
                          int echo, gfp_t flags);
-extern void nfnetlink_set_err(u32 pid, u32 group, int error);
+extern int nfnetlink_set_err(u32 pid, u32 group, int error);
 extern int nfnetlink_unicast(struct sk_buff *skb, u_int32_t pid, int flags);
 
 extern void nfnl_lock(void);
index 0ffe689dfe973b009a23282375f8ccfbcc80a13f..eeac97fcef79734c8548e0897ee8e4a154e1a96c 100644 (file)
@@ -571,7 +571,8 @@ nla_put_failure:
 nlmsg_failure:
        kfree_skb(skb);
 errout:
-       nfnetlink_set_err(0, group, -ENOBUFS);
+       if (nfnetlink_set_err(0, group, -ENOBUFS) > 0)
+               return -ENOBUFS;
        return 0;
 }
 #endif /* CONFIG_NF_CONNTRACK_EVENTS */
index eedc0c1ac7a4e071f5925a79eabada91d18cd20f..35fe185316e7b544f95439315d29bc0bfddfda58 100644 (file)
@@ -114,9 +114,9 @@ int nfnetlink_send(struct sk_buff *skb, u32 pid,
 }
 EXPORT_SYMBOL_GPL(nfnetlink_send);
 
-void nfnetlink_set_err(u32 pid, u32 group, int error)
+int nfnetlink_set_err(u32 pid, u32 group, int error)
 {
-       netlink_set_err(nfnl, pid, group, error);
+       return netlink_set_err(nfnl, pid, group, error);
 }
 EXPORT_SYMBOL_GPL(nfnetlink_set_err);