diff options
author | Florian Westphal <fw@strlen.de> | 2018-05-25 00:25:47 +0200 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2018-05-29 00:27:26 +0200 |
commit | 003087911af28941a95fa053db0ac36b2ee27207 (patch) | |
tree | 8f65587182cf879ecdefcdc3c5b1aaf36ff8bc72 /net | |
parent | 1ac89d20150e377b74d2ef23f56db0f08088426c (diff) | |
download | linux-stable-003087911af28941a95fa053db0ac36b2ee27207.tar.gz linux-stable-003087911af28941a95fa053db0ac36b2ee27207.tar.bz2 linux-stable-003087911af28941a95fa053db0ac36b2ee27207.zip |
netfilter: nfnetlink: allow commit to fail
->commit() cannot fail at the moment.
Followup-patch adds kmalloc calls in the commit phase, so we'll need
to be able to handle errors.
Make it so that -EGAIN causes a full replay, and make other errors
cause the transaction to fail.
Failing is ok from a consistency point of view as long as we
perform all actions that could return an error before
we increment the generation counter and the base seq.
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'net')
-rw-r--r-- | net/netfilter/nfnetlink.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c index 03ead8a9e90c..88c9e222b670 100644 --- a/net/netfilter/nfnetlink.c +++ b/net/netfilter/nfnetlink.c @@ -441,7 +441,14 @@ done: kfree_skb(skb); goto replay; } else if (status == NFNL_BATCH_DONE) { - ss->commit(net, oskb); + err = ss->commit(net, oskb); + if (err == -EAGAIN) { + status |= NFNL_BATCH_REPLAY; + goto done; + } else if (err) { + ss->abort(net, oskb); + netlink_ack(oskb, nlmsg_hdr(oskb), err, NULL); + } } else { ss->abort(net, oskb); } |