@@ -1363,26 +1363,21 @@ static int nf_tables_newrule(struct sock *nlsk, struct sk_buff *skb,
if (nla[NFTA_RULE_HANDLE]) {
handle = be64_to_cpu(nla_get_be64(nla[NFTA_RULE_HANDLE]));
rule = __nf_tables_rule_lookup(chain, handle);
- if (IS_ERR(rule)) {
- if (PTR_ERR(rule) != -ENOENT)
- return PTR_ERR(rule);
- rule = NULL;
- }
+ if (IS_ERR(rule))
+ return PTR_ERR(rule);
- if (rule != NULL) {
- if (nlh->nlmsg_flags & NLM_F_EXCL)
- return -EEXIST;
- if (nlh->nlmsg_flags & NLM_F_REPLACE) {
- old_rule = rule;
- rule = NULL;
- } else
- return 0;
- }
- } else
+ if (nlh->nlmsg_flags & NLM_F_EXCL)
+ return -EEXIST;
+ if (nlh->nlmsg_flags & NLM_F_REPLACE) {
+ old_rule = rule;
+ rule = NULL;
+ } else
+ return 0;
+ } else {
+ if (!create)
+ return -EINVAL;
handle = nf_tables_alloc_handle(table);
-
- if (handle == 0)
- return -EINVAL;
+ }
n = 0;
size = 0;