@@ -6039,21 +6039,18 @@ static int nft_get_set_elem(struct nft_ctx *ctx, const struct nft_set *set,
6039
6039
return err ;
6040
6040
}
6041
6041
6042
- /* called with rcu_read_lock held */
6043
- static int nf_tables_getsetelem (struct sk_buff * skb ,
6044
- const struct nfnl_info * info ,
6045
- const struct nlattr * const nla [])
6042
+ static int nft_set_dump_ctx_init (struct nft_set_dump_ctx * dump_ctx ,
6043
+ const struct sk_buff * skb ,
6044
+ const struct nfnl_info * info ,
6045
+ const struct nlattr * const nla [],
6046
+ bool reset )
6046
6047
{
6047
6048
struct netlink_ext_ack * extack = info -> extack ;
6048
6049
u8 genmask = nft_genmask_cur (info -> net );
6049
6050
u8 family = info -> nfmsg -> nfgen_family ;
6050
- int rem , err = 0 , nelems = 0 ;
6051
6051
struct net * net = info -> net ;
6052
6052
struct nft_table * table ;
6053
6053
struct nft_set * set ;
6054
- struct nlattr * attr ;
6055
- struct nft_ctx ctx ;
6056
- bool reset = false;
6057
6054
6058
6055
table = nft_table_lookup (net , nla [NFTA_SET_ELEM_LIST_TABLE ], family ,
6059
6056
genmask , 0 );
@@ -6068,7 +6065,24 @@ static int nf_tables_getsetelem(struct sk_buff *skb,
6068
6065
return PTR_ERR (set );
6069
6066
}
6070
6067
6071
- nft_ctx_init (& ctx , net , skb , info -> nlh , family , table , NULL , nla );
6068
+ nft_ctx_init (& dump_ctx -> ctx , net , skb ,
6069
+ info -> nlh , family , table , NULL , nla );
6070
+ dump_ctx -> set = set ;
6071
+ dump_ctx -> reset = reset ;
6072
+ return 0 ;
6073
+ }
6074
+
6075
+ /* called with rcu_read_lock held */
6076
+ static int nf_tables_getsetelem (struct sk_buff * skb ,
6077
+ const struct nfnl_info * info ,
6078
+ const struct nlattr * const nla [])
6079
+ {
6080
+ struct netlink_ext_ack * extack = info -> extack ;
6081
+ struct nft_set_dump_ctx dump_ctx ;
6082
+ int rem , err = 0 , nelems = 0 ;
6083
+ struct net * net = info -> net ;
6084
+ struct nlattr * attr ;
6085
+ bool reset = false;
6072
6086
6073
6087
if (NFNL_MSG_TYPE (info -> nlh -> nlmsg_type ) == NFT_MSG_GETSETELEM_RESET )
6074
6088
reset = true;
@@ -6080,11 +6094,10 @@ static int nf_tables_getsetelem(struct sk_buff *skb,
6080
6094
.done = nf_tables_dump_set_done ,
6081
6095
.module = THIS_MODULE ,
6082
6096
};
6083
- struct nft_set_dump_ctx dump_ctx = {
6084
- .set = set ,
6085
- .ctx = ctx ,
6086
- .reset = reset ,
6087
- };
6097
+
6098
+ err = nft_set_dump_ctx_init (& dump_ctx , skb , info , nla , reset );
6099
+ if (err )
6100
+ return err ;
6088
6101
6089
6102
c .data = & dump_ctx ;
6090
6103
return nft_netlink_dump_start_rcu (info -> sk , skb , info -> nlh , & c );
@@ -6093,8 +6106,12 @@ static int nf_tables_getsetelem(struct sk_buff *skb,
6093
6106
if (!nla [NFTA_SET_ELEM_LIST_ELEMENTS ])
6094
6107
return - EINVAL ;
6095
6108
6109
+ err = nft_set_dump_ctx_init (& dump_ctx , skb , info , nla , reset );
6110
+ if (err )
6111
+ return err ;
6112
+
6096
6113
nla_for_each_nested (attr , nla [NFTA_SET_ELEM_LIST_ELEMENTS ], rem ) {
6097
- err = nft_get_set_elem (& ctx , set , attr , reset );
6114
+ err = nft_get_set_elem (& dump_ctx . ctx , dump_ctx . set , attr , reset );
6098
6115
if (err < 0 ) {
6099
6116
NL_SET_BAD_ATTR (extack , attr );
6100
6117
break ;
@@ -6103,7 +6120,7 @@ static int nf_tables_getsetelem(struct sk_buff *skb,
6103
6120
}
6104
6121
6105
6122
if (reset )
6106
- audit_log_nft_set_reset (table , nft_pernet (net )-> base_seq ,
6123
+ audit_log_nft_set_reset (dump_ctx . ctx . table , nft_pernet (net )-> base_seq ,
6107
6124
nelems );
6108
6125
6109
6126
return err ;
0 commit comments