if (nla[NFTA_SET_ELEM_DATA] == NULL &&
                    !(flags & NFT_SET_ELEM_INTERVAL_END))
                        return -EINVAL;
-               if (nla[NFTA_SET_ELEM_DATA] != NULL &&
-                   flags & NFT_SET_ELEM_INTERVAL_END)
-                       return -EINVAL;
        } else {
                if (nla[NFTA_SET_ELEM_DATA] != NULL)
                        return -EINVAL;
        }
 
+       if ((flags & NFT_SET_ELEM_INTERVAL_END) &&
+            (nla[NFTA_SET_ELEM_DATA] ||
+             nla[NFTA_SET_ELEM_OBJREF] ||
+             nla[NFTA_SET_ELEM_TIMEOUT] ||
+             nla[NFTA_SET_ELEM_EXPIRATION] ||
+             nla[NFTA_SET_ELEM_USERDATA] ||
+             nla[NFTA_SET_ELEM_EXPR]))
+               return -EINVAL;
+
        timeout = 0;
        if (nla[NFTA_SET_ELEM_TIMEOUT] != NULL) {
                if (!(set->flags & NFT_SET_TIMEOUT))