--- x/net/bridge/netfilter/ebtables.c +++ y/net/bridge/netfilter/ebtables.c @@ -1161,7 +1161,8 @@ free_newinfo: static void __ebt_unregister_table(struct net *net, struct ebt_table *table) { mutex_lock(&ebt_mutex); - list_del(&table->list); + if (!list_empty(&table->list)) + list_del_init(&table->list); mutex_unlock(&ebt_mutex); audit_log_nfcfg(table->name, AF_BRIDGE, table->private->nentries, AUDIT_XT_OP_UNREGISTER, GFP_KERNEL); @@ -1337,7 +1338,7 @@ void ebt_unregister_template(const struc } EXPORT_SYMBOL(ebt_unregister_template); -static struct ebt_table *__ebt_find_table(struct net *net, const char *name) +static struct ebt_table *__ebt_find_table(struct net *net, const char *name, int del) { struct ebt_pernet *ebt_net = net_generic(net, ebt_pernet_id); struct ebt_table *t; @@ -1346,6 +1347,8 @@ static struct ebt_table *__ebt_find_tabl list_for_each_entry(t, &ebt_net->tables, list) { if (strcmp(t->name, name) == 0) { + if (del) + list_del_init(&t->list); mutex_unlock(&ebt_mutex); return t; } @@ -1357,7 +1360,7 @@ static struct ebt_table *__ebt_find_tabl void ebt_unregister_table_pre_exit(struct net *net, const char *name) { - struct ebt_table *table = __ebt_find_table(net, name); + struct ebt_table *table = __ebt_find_table(net, name, 0); if (table) nf_unregister_net_hooks(net, table->ops, hweight32(table->valid_hooks)); @@ -1366,7 +1369,7 @@ EXPORT_SYMBOL(ebt_unregister_table_pre_e void ebt_unregister_table(struct net *net, const char *name) { - struct ebt_table *table = __ebt_find_table(net, name); + struct ebt_table *table = __ebt_find_table(net, name, 1); if (table) __ebt_unregister_table(net, table);