| From 5d002d876a0bfffbbc6bd4f3db20af1bc7ad4962 Mon Sep 17 00:00:00 2001 |
| From: Pablo Neira Ayuso <pablo@netfilter.org> |
| Date: Fri, 5 Jul 2019 23:38:46 +0200 |
| Subject: [PATCH] netfilter: nf_tables: add nft_expr_type_request_module() |
| |
| commit b9c04ae7907f09c5e873e7c9a8feea2ce41e15b3 upstream. |
| |
| This helper function makes sure the family specific extension is loaded. |
| |
| Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c |
| index 3c69d26e2f09..ef944631b976 100644 |
| --- a/net/netfilter/nf_tables_api.c |
| +++ b/net/netfilter/nf_tables_api.c |
| @@ -2041,6 +2041,19 @@ static const struct nft_expr_type *__nft_expr_type_get(u8 family, |
| return NULL; |
| } |
| |
| +#ifdef CONFIG_MODULES |
| +static int nft_expr_type_request_module(struct net *net, u8 family, |
| + struct nlattr *nla) |
| +{ |
| + nft_request_module(net, "nft-expr-%u-%.*s", family, |
| + nla_len(nla), (char *)nla_data(nla)); |
| + if (__nft_expr_type_get(family, nla)) |
| + return -EAGAIN; |
| + |
| + return 0; |
| +} |
| +#endif |
| + |
| static const struct nft_expr_type *nft_expr_type_get(struct net *net, |
| u8 family, |
| struct nlattr *nla) |
| @@ -2057,9 +2070,7 @@ static const struct nft_expr_type *nft_expr_type_get(struct net *net, |
| lockdep_nfnl_nft_mutex_not_held(); |
| #ifdef CONFIG_MODULES |
| if (type == NULL) { |
| - nft_request_module(net, "nft-expr-%u-%.*s", family, |
| - nla_len(nla), (char *)nla_data(nla)); |
| - if (__nft_expr_type_get(family, nla)) |
| + if (nft_expr_type_request_module(net, family, nla) == -EAGAIN) |
| return ERR_PTR(-EAGAIN); |
| |
| nft_request_module(net, "nft-expr-%.*s", |
| -- |
| 2.7.4 |
| |