Skip to content

Commit

Permalink
netfilter: nf_tables: release mutex after nft_gc_seq_end from abort path
Browse files Browse the repository at this point in the history
commit 0d459e2 upstream.

The commit mutex should not be released during the critical section
between nft_gc_seq_begin() and nft_gc_seq_end(), otherwise, async GC
worker could collect expired objects and get the released commit lock
within the same GC sequence.

nf_tables_module_autoload() temporarily releases the mutex to load
module dependencies, then it goes back to replay the transaction again.
Move it at the end of the abort phase after nft_gc_seq_end() is called.

Cc: stable@vger.kernel.org
Fixes: 7203443 ("netfilter: nf_tables: GC transaction race with abort path")
Reported-by: Kuan-Ting Chen <hexrabbit@devco.re>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
ummakynes authored and gregkh committed Apr 10, 2024
1 parent b0b36dc commit 8038ee3
Showing 1 changed file with 8 additions and 5 deletions.
13 changes: 8 additions & 5 deletions net/netfilter/nf_tables_api.c
Expand Up @@ -10518,11 +10518,6 @@ static int __nf_tables_abort(struct net *net, enum nfnl_abort_action action)
nf_tables_abort_release(trans);
}

if (action == NFNL_ABORT_AUTOLOAD)
nf_tables_module_autoload(net);
else
nf_tables_module_autoload_cleanup(net);

return err;
}

Expand All @@ -10539,6 +10534,14 @@ static int nf_tables_abort(struct net *net, struct sk_buff *skb,

WARN_ON_ONCE(!list_empty(&nft_net->commit_list));

/* module autoload needs to happen after GC sequence update because it
* temporarily releases and grabs mutex again.
*/
if (action == NFNL_ABORT_AUTOLOAD)
nf_tables_module_autoload(net);
else
nf_tables_module_autoload_cleanup(net);

mutex_unlock(&nft_net->commit_mutex);

return ret;
Expand Down

0 comments on commit 8038ee3

Please sign in to comment.