}
 
 static struct nft_rule *nft_rule_lookup_byid(const struct net *net,
+                                            const struct nft_chain *chain,
                                             const struct nlattr *nla);
 
 #define NFT_RULE_MAXEXPRS      128
                                return PTR_ERR(old_rule);
                        }
                } else if (nla[NFTA_RULE_POSITION_ID]) {
-                       old_rule = nft_rule_lookup_byid(net, nla[NFTA_RULE_POSITION_ID]);
+                       old_rule = nft_rule_lookup_byid(net, chain, nla[NFTA_RULE_POSITION_ID]);
                        if (IS_ERR(old_rule)) {
                                NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_POSITION_ID]);
                                return PTR_ERR(old_rule);
 }
 
 static struct nft_rule *nft_rule_lookup_byid(const struct net *net,
+                                            const struct nft_chain *chain,
                                             const struct nlattr *nla)
 {
        struct nftables_pernet *nft_net = nft_pernet(net);
                struct nft_rule *rule = nft_trans_rule(trans);
 
                if (trans->msg_type == NFT_MSG_NEWRULE &&
+                   trans->ctx.chain == chain &&
                    id == nft_trans_rule_id(trans))
                        return rule;
        }
 
                        err = nft_delrule(&ctx, rule);
                } else if (nla[NFTA_RULE_ID]) {
-                       rule = nft_rule_lookup_byid(net, nla[NFTA_RULE_ID]);
+                       rule = nft_rule_lookup_byid(net, chain, nla[NFTA_RULE_ID]);
                        if (IS_ERR(rule)) {
                                NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_ID]);
                                return PTR_ERR(rule);