int nf_queue(struct sk_buff *skb, struct nf_hook_ops *elem,
- struct nf_hook_state *state, unsigned int queuenum);
+ struct nf_hook_state *state, unsigned int queuenum, unsigned int queuetype);
+ void nf_queue_nf_hook_drop(struct nf_hook_ops *ops);
int __init netfilter_queue_init(void);
- /* nf_log.c */
diff --git a/net/netfilter/nf_queue.c b/net/netfilter/nf_queue.c
index 2e88032..8524715 100644
--- a/net/netfilter/nf_queue.c
.pkts_acked = bictcp_acked,
.owner = THIS_MODULE,
.name = "cubic",
-commit 83fccfc3940c4a2db90fd7e7079f5b465cd8c6af
-Author: Eric Dumazet <edumazet@google.com>
-Date: Thu Aug 13 15:44:51 2015 -0700
-
- inet: fix potential deadlock in reqsk_queue_unlink()
-
- When replacing del_timer() with del_timer_sync(), I introduced
- a deadlock condition :
-
- reqsk_queue_unlink() is called from inet_csk_reqsk_queue_drop()
-
- inet_csk_reqsk_queue_drop() can be called from many contexts,
- one being the timer handler itself (reqsk_timer_handler()).
-
- In this case, del_timer_sync() loops forever.
-
- Simple fix is to test if timer is pending.
-
- Fixes: 2235f2ac75fd ("inet: fix races with reqsk timers")
- Signed-off-by: Eric Dumazet <edumazet@google.com>
- Signed-off-by: David S. Miller <davem@davemloft.net>
-
-diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c
-index 05e3145..1349571 100644
---- a/net/ipv4/inet_connection_sock.c
-+++ b/net/ipv4/inet_connection_sock.c
-@@ -593,7 +593,7 @@ static bool reqsk_queue_unlink(struct request_sock_queue *queue,
- }
-
- spin_unlock(&queue->syn_wait_lock);
-- if (del_timer_sync(&req->rsk_timer))
-+ if (timer_pending(&req->rsk_timer) && del_timer_sync(&req->rsk_timer))
- reqsk_put(req);
- return found;
- }