Hi Pablo, On Thu, Dec 27, 2018 at 08:48:00PM +0100, Pablo Neira Ayuso wrote: > On Thu, Dec 20, 2018 at 04:09:17PM +0100, Phil Sutter wrote: > [...] > > + if (chain) { > > + c = nftnl_chain_list_lookup_byname(list, chain); > > + if (!c) { > > + errno = ENOENT; > > + return 0; > > + } > > + d.builtin_err = -2; > > + ret = __nft_chain_user_del(c, &d); > > + if (ret == -2) > > We can probably do an upfront check for built-in chain to avoid this > special code? __nft_chain_user_del() is only called from > nft_chain_user_del(). Well, __nft_chain_user_del() is either called for a user-specified chain or for all chains of the given table. While that builtin_err field could be avoided by having the nft_chain_builtin() check in the first case before dispatching to __nft_chain_user_del(), in the second case __nft_chain_user_del() still has to do the check so it doesn't try to delete builtin chains by accident. By using this conditional error code, the nft_chain_builtin() check doesn't happen twice when deleting a user-specified chain. If you think it's not worth it, just let me know and I'll send a follow-up which removes it (and introduces the unavoidable double check). Cheers, Phil