|
@@ -1711,9 +1711,12 @@ static int nf_tables_fill_rule_info(struct sk_buff *skb, struct net *net,
|
|
|
}
|
|
|
nla_nest_end(skb, list);
|
|
|
|
|
|
- if (rule->ulen &&
|
|
|
- nla_put(skb, NFTA_RULE_USERDATA, rule->ulen, nft_userdata(rule)))
|
|
|
- goto nla_put_failure;
|
|
|
+ if (rule->udata) {
|
|
|
+ struct nft_userdata *udata = nft_userdata(rule);
|
|
|
+ if (nla_put(skb, NFTA_RULE_USERDATA, udata->len + 1,
|
|
|
+ udata->data) < 0)
|
|
|
+ goto nla_put_failure;
|
|
|
+ }
|
|
|
|
|
|
nlmsg_end(skb, nlh);
|
|
|
return 0;
|
|
@@ -1896,11 +1899,12 @@ static int nf_tables_newrule(struct sock *nlsk, struct sk_buff *skb,
|
|
|
struct nft_table *table;
|
|
|
struct nft_chain *chain;
|
|
|
struct nft_rule *rule, *old_rule = NULL;
|
|
|
+ struct nft_userdata *udata;
|
|
|
struct nft_trans *trans = NULL;
|
|
|
struct nft_expr *expr;
|
|
|
struct nft_ctx ctx;
|
|
|
struct nlattr *tmp;
|
|
|
- unsigned int size, i, n, ulen = 0;
|
|
|
+ unsigned int size, i, n, ulen = 0, usize = 0;
|
|
|
int err, rem;
|
|
|
bool create;
|
|
|
u64 handle, pos_handle;
|
|
@@ -1973,11 +1977,14 @@ static int nf_tables_newrule(struct sock *nlsk, struct sk_buff *skb,
|
|
|
if (size >= 1 << 12)
|
|
|
goto err1;
|
|
|
|
|
|
- if (nla[NFTA_RULE_USERDATA])
|
|
|
+ if (nla[NFTA_RULE_USERDATA]) {
|
|
|
ulen = nla_len(nla[NFTA_RULE_USERDATA]);
|
|
|
+ if (ulen > 0)
|
|
|
+ usize = sizeof(struct nft_userdata) + ulen;
|
|
|
+ }
|
|
|
|
|
|
err = -ENOMEM;
|
|
|
- rule = kzalloc(sizeof(*rule) + size + ulen, GFP_KERNEL);
|
|
|
+ rule = kzalloc(sizeof(*rule) + size + usize, GFP_KERNEL);
|
|
|
if (rule == NULL)
|
|
|
goto err1;
|
|
|
|
|
@@ -1985,10 +1992,13 @@ static int nf_tables_newrule(struct sock *nlsk, struct sk_buff *skb,
|
|
|
|
|
|
rule->handle = handle;
|
|
|
rule->dlen = size;
|
|
|
- rule->ulen = ulen;
|
|
|
+ rule->udata = ulen ? 1 : 0;
|
|
|
|
|
|
- if (ulen)
|
|
|
- nla_memcpy(nft_userdata(rule), nla[NFTA_RULE_USERDATA], ulen);
|
|
|
+ if (ulen) {
|
|
|
+ udata = nft_userdata(rule);
|
|
|
+ udata->len = ulen - 1;
|
|
|
+ nla_memcpy(udata->data, nla[NFTA_RULE_USERDATA], ulen);
|
|
|
+ }
|
|
|
|
|
|
expr = nft_expr_first(rule);
|
|
|
for (i = 0; i < n; i++) {
|