diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index 105a616..0aa1b30 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c @@ -425,6 +425,7 @@ static int ctnetlink_conntrack_event(struct notifier_block *this, unsigned int type; sk_buff_data_t b; unsigned int flags = 0, group; + static unsigned int size = 128; /* ignore our fake conntrack entry */ if (ct == &nf_conntrack_untracked) @@ -446,7 +447,8 @@ static int ctnetlink_conntrack_event(struct notifier_block *this, if (!nfnetlink_has_listeners(group)) return NOTIFY_DONE; - skb = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC); +retry: + skb = alloc_skb(size, GFP_ATOMIC); if (!skb) return NOTIFY_DONE; @@ -525,7 +527,8 @@ static int ctnetlink_conntrack_event(struct notifier_block *this, nlmsg_failure: nla_put_failure: kfree_skb(skb); - return NOTIFY_DONE; + size <<= 1; + goto retry; } #endif /* CONFIG_NF_CONNTRACK_EVENTS */