Skip to content

Commit 520aa74

Browse files
committed
netfilter: nft_compat: fix module refcount underflow
Feb 12 18:20:42 nfdev kernel: ------------[ cut here ]------------ Feb 12 18:20:42 nfdev kernel: WARNING: CPU: 4 PID: 4359 at kernel/module.c:963 module_put+0x9b/0xba() Feb 12 18:20:42 nfdev kernel: CPU: 4 PID: 4359 Comm: ebtables-compat Tainted: G W 3.19.0-rc6+ #43 [...] Feb 12 18:20:42 nfdev kernel: Call Trace: Feb 12 18:20:42 nfdev kernel: [<ffffffff815fd911>] dump_stack+0x4c/0x65 Feb 12 18:20:42 nfdev kernel: [<ffffffff8103e6f7>] warn_slowpath_common+0x9c/0xb6 Feb 12 18:20:42 nfdev kernel: [<ffffffff8109919f>] ? module_put+0x9b/0xba Feb 12 18:20:42 nfdev kernel: [<ffffffff8103e726>] warn_slowpath_null+0x15/0x17 Feb 12 18:20:42 nfdev kernel: [<ffffffff8109919f>] module_put+0x9b/0xba Feb 12 18:20:42 nfdev kernel: [<ffffffff813ecf7c>] nft_match_destroy+0x45/0x4c Feb 12 18:20:42 nfdev kernel: [<ffffffff813e683f>] nf_tables_rule_destroy+0x28/0x70 Reported-by: Arturo Borrero Gonzalez <[email protected]> Signed-off-by: Pablo Neira Ayuso <[email protected]> Tested-by: Arturo Borrero Gonzalez <[email protected]>
1 parent dd3733b commit 520aa74

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

net/netfilter/nft_compat.c

+10-2
Original file line numberDiff line numberDiff line change
@@ -578,8 +578,12 @@ nft_match_select_ops(const struct nft_ctx *ctx,
578578
struct xt_match *match = nft_match->ops.data;
579579

580580
if (strcmp(match->name, mt_name) == 0 &&
581-
match->revision == rev && match->family == family)
581+
match->revision == rev && match->family == family) {
582+
if (!try_module_get(match->me))
583+
return ERR_PTR(-ENOENT);
584+
582585
return &nft_match->ops;
586+
}
583587
}
584588

585589
match = xt_request_find_match(family, mt_name, rev);
@@ -648,8 +652,12 @@ nft_target_select_ops(const struct nft_ctx *ctx,
648652
struct xt_target *target = nft_target->ops.data;
649653

650654
if (strcmp(target->name, tg_name) == 0 &&
651-
target->revision == rev && target->family == family)
655+
target->revision == rev && target->family == family) {
656+
if (!try_module_get(target->me))
657+
return ERR_PTR(-ENOENT);
658+
652659
return &nft_target->ops;
660+
}
653661
}
654662

655663
target = xt_request_find_target(family, tg_name, rev);

0 commit comments

Comments
 (0)