Skip to content

Commit 37b7ef7

Browse files
ummakynesdavem330
authored andcommitted
netfilter: ctnetlink: fix reliable event delivery if message building fails
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 <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 1a50307 commit 37b7ef7

File tree

3 files changed

+6
-4
lines changed

3 files changed

+6
-4
lines changed

include/linux/netfilter/nfnetlink.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ extern int nfnetlink_subsys_unregister(const struct nfnetlink_subsystem *n);
7676
extern int nfnetlink_has_listeners(struct net *net, unsigned int group);
7777
extern int nfnetlink_send(struct sk_buff *skb, struct net *net, u32 pid, unsigned group,
7878
int echo, gfp_t flags);
79-
extern void nfnetlink_set_err(struct net *net, u32 pid, u32 group, int error);
79+
extern int nfnetlink_set_err(struct net *net, u32 pid, u32 group, int error);
8080
extern int nfnetlink_unicast(struct sk_buff *skb, struct net *net, u_int32_t pid, int flags);
8181

8282
extern void nfnl_lock(void);

net/netfilter/nf_conntrack_netlink.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -582,7 +582,9 @@ ctnetlink_conntrack_event(unsigned int events, struct nf_ct_event *item)
582582
nlmsg_failure:
583583
kfree_skb(skb);
584584
errout:
585-
nfnetlink_set_err(net, 0, group, -ENOBUFS);
585+
if (nfnetlink_set_err(net, 0, group, -ENOBUFS) > 0)
586+
return -ENOBUFS;
587+
586588
return 0;
587589
}
588590
#endif /* CONFIG_NF_CONNTRACK_EVENTS */

net/netfilter/nfnetlink.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,9 @@ int nfnetlink_send(struct sk_buff *skb, struct net *net, u32 pid,
113113
}
114114
EXPORT_SYMBOL_GPL(nfnetlink_send);
115115

116-
void nfnetlink_set_err(struct net *net, u32 pid, u32 group, int error)
116+
int nfnetlink_set_err(struct net *net, u32 pid, u32 group, int error)
117117
{
118-
netlink_set_err(net->nfnl, pid, group, error);
118+
return netlink_set_err(net->nfnl, pid, group, error);
119119
}
120120
EXPORT_SYMBOL_GPL(nfnetlink_set_err);
121121

0 commit comments

Comments
 (0)