]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/netfilter/nft_dynset.c
Merge branch 'fixed-phy-phydev-leaks'
[karo-tx-linux.git] / net / netfilter / nft_dynset.c
index 517f08767a3cd677dba53c1f6ec28f77288ebcbc..31ca94793aa9622f4a77ab852c3a8c1a422ba658 100644 (file)
@@ -44,18 +44,22 @@ static void *nft_dynset_new(struct nft_set *set, const struct nft_expr *expr,
                                 &regs->data[priv->sreg_key],
                                 &regs->data[priv->sreg_data],
                                 timeout, GFP_ATOMIC);
-       if (elem == NULL) {
-               if (set->size)
-                       atomic_dec(&set->nelems);
-               return NULL;
-       }
+       if (elem == NULL)
+               goto err1;
 
        ext = nft_set_elem_ext(set, elem);
        if (priv->expr != NULL &&
            nft_expr_clone(nft_set_ext_expr(ext), priv->expr) < 0)
-               return NULL;
+               goto err2;
 
        return elem;
+
+err2:
+       nft_set_elem_destroy(set, elem, false);
+err1:
+       if (set->size)
+               atomic_dec(&set->nelems);
+       return NULL;
 }
 
 static void nft_dynset_eval(const struct nft_expr *expr,
@@ -139,6 +143,9 @@ static int nft_dynset_init(const struct nft_ctx *ctx,
                        return PTR_ERR(set);
        }
 
+       if (set->ops->update == NULL)
+               return -EOPNOTSUPP;
+
        if (set->flags & NFT_SET_CONSTANT)
                return -EBUSY;