ulog: fix panic on SMP kernels
[NETFILTER]: ulog: fix panic on SMP kernels Fix kernel panic on various SMP machines. The culprit is a null ub->skb in ulog_send(). If ulog_timer() has already been scheduled on one CPU and is spinning on the lock, and ipt_ulog_packet() flushes the queue on another CPU by calling ulog_send() right before it exits, there will be no skbuff when ulog_timer() acquires the lock and calls ulog_send(). Cancelling the timer in ulog_send() doesn't help because it has already been scheduled and is running on the first CPU. Similar problem exists in ebt_ulog.c and nfnetlink_log.c. Signed-off-by: Mark Huang <mlhuang@cs.princeton.edu> Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
f60aad2751
commit
bb417c4bad
@@ -75,6 +75,9 @@ static void ulog_send(unsigned int nlgroup)
|
||||
if (timer_pending(&ub->timer))
|
||||
del_timer(&ub->timer);
|
||||
|
||||
if (!ub->skb)
|
||||
return;
|
||||
|
||||
/* last nlmsg needs NLMSG_DONE */
|
||||
if (ub->qlen > 1)
|
||||
ub->lastnlh->nlmsg_type = NLMSG_DONE;
|
||||
|
||||
@@ -116,6 +116,11 @@ static void ulog_send(unsigned int nlgroupnum)
|
||||
del_timer(&ub->timer);
|
||||
}
|
||||
|
||||
if (!ub->skb) {
|
||||
DEBUGP("ipt_ULOG: ulog_send: nothing to send\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* last nlmsg needs NLMSG_DONE */
|
||||
if (ub->qlen > 1)
|
||||
ub->lastnlh->nlmsg_type = NLMSG_DONE;
|
||||
|
||||
@@ -366,6 +366,9 @@ __nfulnl_send(struct nfulnl_instance *inst)
|
||||
if (timer_pending(&inst->timer))
|
||||
del_timer(&inst->timer);
|
||||
|
||||
if (!inst->skb)
|
||||
return 0;
|
||||
|
||||
if (inst->qlen > 1)
|
||||
inst->lastnlh->nlmsg_type = NLMSG_DONE;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user