Commit ce7663d84a87bb4e1743f62950bf7dceed723a13
Committed by
David S. Miller
1 parent
0d53778e81
Exists in
master
and in
40 other branches
[NETFILTER]: nfnetlink_queue: don't unregister handler of other subsystem
The queue handlers registered by ip[6]_queue.ko at initialization should not be unregistered according to requests from userland program using nfnetlink_queue. If we allow that, there is no way to register the handlers of built-in ip[6]_queue again. Signed-off-by: Yasuyuki Kozakai <yasuyuki.kozakai@toshiba.co.jp> Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Showing 3 changed files with 9 additions and 5 deletions Side-by-side Diff
include/linux/netfilter.h
... | ... | @@ -275,7 +275,8 @@ |
275 | 275 | }; |
276 | 276 | extern int nf_register_queue_handler(int pf, |
277 | 277 | struct nf_queue_handler *qh); |
278 | -extern int nf_unregister_queue_handler(int pf); | |
278 | +extern int nf_unregister_queue_handler(int pf, | |
279 | + struct nf_queue_handler *qh); | |
279 | 280 | extern void nf_unregister_queue_handlers(struct nf_queue_handler *qh); |
280 | 281 | extern void nf_reinject(struct sk_buff *skb, |
281 | 282 | struct nf_info *info, |
net/netfilter/nf_queue.c
... | ... | @@ -44,12 +44,17 @@ |
44 | 44 | EXPORT_SYMBOL(nf_register_queue_handler); |
45 | 45 | |
46 | 46 | /* The caller must flush their queue before this */ |
47 | -int nf_unregister_queue_handler(int pf) | |
47 | +int nf_unregister_queue_handler(int pf, struct nf_queue_handler *qh) | |
48 | 48 | { |
49 | 49 | if (pf >= NPROTO) |
50 | 50 | return -EINVAL; |
51 | 51 | |
52 | 52 | write_lock_bh(&queue_handler_lock); |
53 | + if (queue_handler[pf] != qh) { | |
54 | + write_unlock_bh(&queue_handler_lock); | |
55 | + return -EINVAL; | |
56 | + } | |
57 | + | |
53 | 58 | queue_handler[pf] = NULL; |
54 | 59 | write_unlock_bh(&queue_handler_lock); |
55 | 60 |
net/netfilter/nfnetlink_queue.c
... | ... | @@ -913,9 +913,7 @@ |
913 | 913 | case NFQNL_CFG_CMD_PF_UNBIND: |
914 | 914 | QDEBUG("unregistering queue handler for pf=%u\n", |
915 | 915 | ntohs(cmd->pf)); |
916 | - /* This is a bug and a feature. We can unregister | |
917 | - * other handlers(!) */ | |
918 | - ret = nf_unregister_queue_handler(ntohs(cmd->pf)); | |
916 | + ret = nf_unregister_queue_handler(ntohs(cmd->pf), &nfqh); | |
919 | 917 | break; |
920 | 918 | default: |
921 | 919 | ret = -EINVAL; |