···478478{479479 struct xfrm_decap_state decap;480480481481- if (sizeof(struct esp_decap_data) <481481+ if (sizeof(struct esp_decap_data) >482482 sizeof(decap.decap_data)) {483483 extern void decap_data_too_small(void);484484
+10
net/ipv4/netfilter/ip_queue.c
···33 * communicating with userspace via netlink.44 *55 * (C) 2000-2002 James Morris <jmorris@intercode.com.au>66+ * (C) 2003-2005 Netfilter Core Team <coreteam@netfilter.org>67 *78 * This program is free software; you can redistribute it and/or modify89 * it under the terms of the GNU General Public License version 2 as···1817 * 2005-01-10: Added /proc counter for dropped packets; fixed so1918 * packets aren't delivered to user space if they're going 2019 * to be dropped. 2020+ * 2005-05-26: local_bh_{disable,enable} around nf_reinject (Harald Welte)2121 *2222 */2323#include <linux/module.h>···7371static void7472ipq_issue_verdict(struct ipq_queue_entry *entry, int verdict)7573{7474+ /* TCP input path (and probably other bits) assume to be called7575+ * from softirq context, not from syscall, like ipq_issue_verdict is7676+ * called. TCP input path deadlocks with locks taken from timer7777+ * softirq, e.g. We therefore emulate this by local_bh_disable() */7878+7979+ local_bh_disable();7680 nf_reinject(entry->skb, entry->info, verdict);8181+ local_bh_enable();8282+7783 kfree(entry);7884}7985
+6-6
net/ipv4/udp.c
···738738 unsigned long amount;739739740740 amount = 0;741741- spin_lock_irq(&sk->sk_receive_queue.lock);741741+ spin_lock_bh(&sk->sk_receive_queue.lock);742742 skb = skb_peek(&sk->sk_receive_queue);743743 if (skb != NULL) {744744 /*···748748 */749749 amount = skb->len - sizeof(struct udphdr);750750 }751751- spin_unlock_irq(&sk->sk_receive_queue.lock);751751+ spin_unlock_bh(&sk->sk_receive_queue.lock);752752 return put_user(amount, (int __user *)arg);753753 }754754···848848 /* Clear queue. */849849 if (flags&MSG_PEEK) {850850 int clear = 0;851851- spin_lock_irq(&sk->sk_receive_queue.lock);851851+ spin_lock_bh(&sk->sk_receive_queue.lock);852852 if (skb == skb_peek(&sk->sk_receive_queue)) {853853 __skb_unlink(skb, &sk->sk_receive_queue);854854 clear = 1;855855 }856856- spin_unlock_irq(&sk->sk_receive_queue.lock);856856+ spin_unlock_bh(&sk->sk_receive_queue.lock);857857 if (clear)858858 kfree_skb(skb);859859 }···13341334 struct sk_buff_head *rcvq = &sk->sk_receive_queue;13351335 struct sk_buff *skb;1336133613371337- spin_lock_irq(&rcvq->lock);13371337+ spin_lock_bh(&rcvq->lock);13381338 while ((skb = skb_peek(rcvq)) != NULL) {13391339 if (udp_checksum_complete(skb)) {13401340 UDP_INC_STATS_BH(UDP_MIB_INERRORS);···13451345 break;13461346 }13471347 }13481348- spin_unlock_irq(&rcvq->lock);13481348+ spin_unlock_bh(&rcvq->lock);1349134913501350 /* nothing to see, move along */13511351 if (skb == NULL)
+11-5
net/sched/sch_dsmark.c
···1818#include <asm/byteorder.h>191920202121-#if 1 /* control */2121+#if 0 /* control */2222#define DPRINTK(format,args...) printk(KERN_DEBUG format,##args)2323#else2424#define DPRINTK(format,args...)···73737474 DPRINTK("dsmark_graft(sch %p,[qdisc %p],new %p,old %p)\n",sch,p,new,7575 old);7676- if (!new)7777- new = &noop_qdisc;7676+7777+ if (new == NULL) {7878+ new = qdisc_create_dflt(sch->dev, &pfifo_qdisc_ops);7979+ if (new == NULL)8080+ new = &noop_qdisc;8181+ }8282+7883 sch_tree_lock(sch);7984 *old = xchg(&p->q,new);8085 if (*old)···168163 return;169164 for (i = 0; i < p->indices; i++) {170165 if (p->mask[i] == 0xff && !p->value[i])171171- continue;166166+ goto ignore;172167 if (walker->count >= walker->skip) {173168 if (walker->fn(sch, i+1, walker) < 0) {174169 walker->stop = 1;175170 break;176171 }177172 }178178- walker->count++;173173+ignore: 174174+ walker->count++;179175 }180176}181177