Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b51d3fa3 authored by Houcheng Lin's avatar Houcheng Lin Committed by Pablo Neira Ayuso
Browse files

netfilter: nf_log: release skbuff on nlmsg put failure



The kernel should reserve enough room in the skb so that the DONE
message can always be appended.  However, in case of e.g. new attribute
erronously not being size-accounted for, __nfulnl_send() will still
try to put next nlmsg into this full skbuf, causing the skb to be stuck
forever and blocking delivery of further messages.

Fix issue by releasing skb immediately after nlmsg_put error and
WARN() so we can track down the cause of such size mismatch.

[ fw@strlen.de: add tailroom/len info to WARN ]

Signed-off-by: default avatarHoucheng Lin <houcheng@gmail.com>
Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent c1e7dc91
Loading
Loading
Loading
Loading
+8 −9
Original line number Diff line number Diff line
@@ -346,26 +346,25 @@ nfulnl_alloc_skb(struct net *net, u32 peer_portid, unsigned int inst_size,
	return skb;
}

static int
static void
__nfulnl_send(struct nfulnl_instance *inst)
{
	int status = -1;

	if (inst->qlen > 1) {
		struct nlmsghdr *nlh = nlmsg_put(inst->skb, 0, 0,
						 NLMSG_DONE,
						 sizeof(struct nfgenmsg),
						 0);
		if (!nlh)
		if (WARN_ONCE(!nlh, "bad nlskb size: %u, tailroom %d\n",
			      inst->skb->len, skb_tailroom(inst->skb))) {
			kfree_skb(inst->skb);
			goto out;
		}
	status = nfnetlink_unicast(inst->skb, inst->net, inst->peer_portid,
	}
	nfnetlink_unicast(inst->skb, inst->net, inst->peer_portid,
			  MSG_DONTWAIT);

out:
	inst->qlen = 0;
	inst->skb = NULL;
out:
	return status;
}

static void