[kernel] r4904 - in dists/sid/linux-2.6/debian: . patches-debian patches-debian/series

maximilian attems maks-guest at costa.debian.org
Fri Nov 25 22:28:55 UTC 2005


Author: maks-guest
Date: Fri Nov 25 22:28:54 2005
New Revision: 4904

Added:
   dists/sid/linux-2.6/debian/patches-debian/2.6.14.3.patch
Modified:
   dists/sid/linux-2.6/debian/changelog
   dists/sid/linux-2.6/debian/patches-debian/series/2.6.14-4
Log:
add huge 2.6.14.3
fingers crossed it doesn't conflict with other backported stuff.


Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog	(original)
+++ dists/sid/linux-2.6/debian/changelog	Fri Nov 25 22:28:54 2005
@@ -19,7 +19,33 @@
   * Re-added powerpc/apus patch, now that Roman Zippel merged it in.
   * Let's create asm-(ppc|ppc64) -> asm-powerpc symlink farm.  (Closes: #340571)
 
- -- Sven Luther <luther at debian.org>  Thu, 24 Nov 2005 11:11:36 +0000
+  [ maximilian attems ]
+  * Add 2.6.14.3 patch - features changelog:
+    - isdn/hardware/eicon/os_4bri.c: correct the xdiLoadFile() signature
+    - x86_64/i386: Compute correct MTRR mask on early Noconas
+    - PPTP helper: Fix endianness bug in GRE key / CallID NAT
+    - nf_queue: Fix Ooops when no queue handler registered
+    - ctnetlink: check if protoinfo is present
+    - ip_conntrack: fix ftp/irc/tftp helpers on ports >= 32768
+    - VFS: Fix memory leak with file leases
+    - hwmon: Fix lm78 VID conversion
+    - hwmon: Fix missing it87 fan div init
+    - ppc64 memory model depends on NUMA
+    - Generic HDLC WAN drivers - disable netif_carrier_off()
+    - ctnetlink: Fix oops when no ICMP ID info in message
+    - Don't auto-reap traced children
+    - packet writing oops fix
+    - PPTP helper: fix PNS-PAC expectation call id
+    - NAT: Fix module refcount dropping too far
+    - Fix soft lockup with ALSA rtc-timer
+    - Fix calculation of AH length during filling ancillary data.
+    - ip_conntrack TCP: Accept SYN+PUSH like SYN
+    - refcount leak of proto when ctnetlink dumping tuple
+    - Fix memory management error during setting up new advapi sockopts.
+    - Fix sending extension headers before and including routing header.
+    - hwmon: Fix missing boundary check when setting W83627THF in0 limits
+
+ -- maximilian attems <maks at sternwelten.at>  Fri, 25 Nov 2005 23:22:52 +0100
 
 linux-2.6 (2.6.14-3) unstable; urgency=low
 

Added: dists/sid/linux-2.6/debian/patches-debian/2.6.14.3.patch
==============================================================================
--- (empty file)
+++ dists/sid/linux-2.6/debian/patches-debian/2.6.14.3.patch	Fri Nov 25 22:28:54 2005
@@ -0,0 +1,811 @@
+diff --git a/arch/i386/kernel/cpu/mtrr/main.c b/arch/i386/kernel/cpu/mtrr/main.c
+index dd4ebd6..1e9db19 100644
+--- a/arch/i386/kernel/cpu/mtrr/main.c
++++ b/arch/i386/kernel/cpu/mtrr/main.c
+@@ -626,6 +626,14 @@ void __init mtrr_bp_init(void)
+ 		if (cpuid_eax(0x80000000) >= 0x80000008) {
+ 			u32 phys_addr;
+ 			phys_addr = cpuid_eax(0x80000008) & 0xff;
++			/* CPUID workaround for Intel 0F33/0F34 CPU */
++			if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
++			    boot_cpu_data.x86 == 0xF &&
++			    boot_cpu_data.x86_model == 0x3 &&
++			    (boot_cpu_data.x86_mask == 0x3 ||
++			     boot_cpu_data.x86_mask == 0x4))
++				phys_addr = 36;
++
+ 			size_or_mask = ~((1 << (phys_addr - PAGE_SHIFT)) - 1);
+ 			size_and_mask = ~size_or_mask & 0xfff00000;
+ 		} else if (boot_cpu_data.x86_vendor == X86_VENDOR_CENTAUR &&
+diff --git a/arch/ppc64/Kconfig b/arch/ppc64/Kconfig
+index c658650..8abf111 100644
+--- a/arch/ppc64/Kconfig
++++ b/arch/ppc64/Kconfig
+@@ -234,6 +234,10 @@ config HMT
+ 	  This option enables hardware multithreading on RS64 cpus.
+ 	  pSeries systems p620 and p660 have such a cpu type.
+ 
++config NUMA
++	bool "NUMA support"
++	default y if DISCONTIGMEM || SPARSEMEM
++
+ config ARCH_SELECT_MEMORY_MODEL
+ 	def_bool y
+ 
+@@ -249,9 +253,6 @@ config ARCH_DISCONTIGMEM_DEFAULT
+ 	def_bool y
+ 	depends on ARCH_DISCONTIGMEM_ENABLE
+ 
+-config ARCH_FLATMEM_ENABLE
+-	def_bool y
+-
+ config ARCH_SPARSEMEM_ENABLE
+ 	def_bool y
+ 	depends on ARCH_DISCONTIGMEM_ENABLE
+@@ -274,10 +275,6 @@ config NODES_SPAN_OTHER_NODES
+ 	def_bool y
+ 	depends on NEED_MULTIPLE_NODES
+ 
+-config NUMA
+-	bool "NUMA support"
+-	default y if DISCONTIGMEM || SPARSEMEM
+-
+ config SCHED_SMT
+ 	bool "SMT (Hyperthreading) scheduler support"
+ 	depends on SMP
+diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c
+index cb28df1..5518428 100644
+--- a/arch/x86_64/kernel/setup.c
++++ b/arch/x86_64/kernel/setup.c
+@@ -993,6 +993,11 @@ static void __cpuinit init_intel(struct 
+ 		unsigned eax = cpuid_eax(0x80000008);
+ 		c->x86_virt_bits = (eax >> 8) & 0xff;
+ 		c->x86_phys_bits = eax & 0xff;
++		/* CPUID workaround for Intel 0F34 CPU */
++		if (c->x86_vendor == X86_VENDOR_INTEL &&
++		    c->x86 == 0xF && c->x86_model == 0x3 &&
++		    c->x86_mask == 0x4)
++			c->x86_phys_bits = 36;
+ 	}
+ 
+ 	if (c->x86 == 15)
+diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
+index a280e67..a10ee02 100644
+--- a/drivers/block/pktcdvd.c
++++ b/drivers/block/pktcdvd.c
+@@ -1191,7 +1191,7 @@ static void pkt_count_states(struct pktc
+ 	struct packet_data *pkt;
+ 	int i;
+ 
+-	for (i = 0; i <= PACKET_NUM_STATES; i++)
++	for (i = 0; i < PACKET_NUM_STATES; i++)
+ 		states[i] = 0;
+ 
+ 	spin_lock(&pd->cdrw.active_list_lock);
+diff --git a/drivers/char/rtc.c b/drivers/char/rtc.c
+index 63fff7c..a7f099f 100644
+--- a/drivers/char/rtc.c
++++ b/drivers/char/rtc.c
+@@ -149,8 +149,22 @@ static void get_rtc_alm_time (struct rtc
+ #ifdef RTC_IRQ
+ static void rtc_dropped_irq(unsigned long data);
+ 
+-static void set_rtc_irq_bit(unsigned char bit);
+-static void mask_rtc_irq_bit(unsigned char bit);
++static void set_rtc_irq_bit_locked(unsigned char bit);
++static void mask_rtc_irq_bit_locked(unsigned char bit);
++
++static inline void set_rtc_irq_bit(unsigned char bit)
++{
++	spin_lock_irq(&rtc_lock);
++	set_rtc_irq_bit_locked(bit);
++	spin_unlock_irq(&rtc_lock);
++}
++
++static void mask_rtc_irq_bit(unsigned char bit)
++{
++	spin_lock_irq(&rtc_lock);
++	mask_rtc_irq_bit_locked(bit);
++	spin_unlock_irq(&rtc_lock);
++}
+ #endif
+ 
+ static int rtc_proc_open(struct inode *inode, struct file *file);
+@@ -401,18 +415,19 @@ static int rtc_do_ioctl(unsigned int cmd
+ 	}
+ 	case RTC_PIE_OFF:	/* Mask periodic int. enab. bit	*/
+ 	{
+-		mask_rtc_irq_bit(RTC_PIE);
++		unsigned long flags; /* can be called from isr via rtc_control() */
++		spin_lock_irqsave (&rtc_lock, flags);
++		mask_rtc_irq_bit_locked(RTC_PIE);
+ 		if (rtc_status & RTC_TIMER_ON) {
+-			spin_lock_irq (&rtc_lock);
+ 			rtc_status &= ~RTC_TIMER_ON;
+ 			del_timer(&rtc_irq_timer);
+-			spin_unlock_irq (&rtc_lock);
+ 		}
++		spin_unlock_irqrestore (&rtc_lock, flags);
+ 		return 0;
+ 	}
+ 	case RTC_PIE_ON:	/* Allow periodic ints		*/
+ 	{
+-
++		unsigned long flags; /* can be called from isr via rtc_control() */
+ 		/*
+ 		 * We don't really want Joe User enabling more
+ 		 * than 64Hz of interrupts on a multi-user machine.
+@@ -421,14 +436,14 @@ static int rtc_do_ioctl(unsigned int cmd
+ 			(!capable(CAP_SYS_RESOURCE)))
+ 			return -EACCES;
+ 
++		spin_lock_irqsave (&rtc_lock, flags);
+ 		if (!(rtc_status & RTC_TIMER_ON)) {
+-			spin_lock_irq (&rtc_lock);
+ 			rtc_irq_timer.expires = jiffies + HZ/rtc_freq + 2*HZ/100;
+ 			add_timer(&rtc_irq_timer);
+ 			rtc_status |= RTC_TIMER_ON;
+-			spin_unlock_irq (&rtc_lock);
+ 		}
+-		set_rtc_irq_bit(RTC_PIE);
++		set_rtc_irq_bit_locked(RTC_PIE);
++		spin_unlock_irqrestore (&rtc_lock, flags);
+ 		return 0;
+ 	}
+ 	case RTC_UIE_OFF:	/* Mask ints from RTC updates.	*/
+@@ -609,6 +624,7 @@ static int rtc_do_ioctl(unsigned int cmd
+ 	{
+ 		int tmp = 0;
+ 		unsigned char val;
++		unsigned long flags; /* can be called from isr via rtc_control() */
+ 
+ 		/* 
+ 		 * The max we can do is 8192Hz.
+@@ -631,9 +647,9 @@ static int rtc_do_ioctl(unsigned int cmd
+ 		if (arg != (1<<tmp))
+ 			return -EINVAL;
+ 
+-		spin_lock_irq(&rtc_lock);
++		spin_lock_irqsave(&rtc_lock, flags);
+ 		if (hpet_set_periodic_freq(arg)) {
+-			spin_unlock_irq(&rtc_lock);
++			spin_unlock_irqrestore(&rtc_lock, flags);
+ 			return 0;
+ 		}
+ 		rtc_freq = arg;
+@@ -641,7 +657,7 @@ static int rtc_do_ioctl(unsigned int cmd
+ 		val = CMOS_READ(RTC_FREQ_SELECT) & 0xf0;
+ 		val |= (16 - tmp);
+ 		CMOS_WRITE(val, RTC_FREQ_SELECT);
+-		spin_unlock_irq(&rtc_lock);
++		spin_unlock_irqrestore(&rtc_lock, flags);
+ 		return 0;
+ 	}
+ #endif
+@@ -844,12 +860,15 @@ int rtc_control(rtc_task_t *task, unsign
+ #ifndef RTC_IRQ
+ 	return -EIO;
+ #else
+-	spin_lock_irq(&rtc_task_lock);
++	unsigned long flags;
++	if (cmd != RTC_PIE_ON && cmd != RTC_PIE_OFF && cmd != RTC_IRQP_SET)
++		return -EINVAL;
++	spin_lock_irqsave(&rtc_task_lock, flags);
+ 	if (rtc_callback != task) {
+-		spin_unlock_irq(&rtc_task_lock);
++		spin_unlock_irqrestore(&rtc_task_lock, flags);
+ 		return -ENXIO;
+ 	}
+-	spin_unlock_irq(&rtc_task_lock);
++	spin_unlock_irqrestore(&rtc_task_lock, flags);
+ 	return rtc_do_ioctl(cmd, arg, 1);
+ #endif
+ }
+@@ -1306,40 +1325,32 @@ static void get_rtc_alm_time(struct rtc_
+  * meddles with the interrupt enable/disable bits.
+  */
+ 
+-static void mask_rtc_irq_bit(unsigned char bit)
++static void mask_rtc_irq_bit_locked(unsigned char bit)
+ {
+ 	unsigned char val;
+ 
+-	spin_lock_irq(&rtc_lock);
+-	if (hpet_mask_rtc_irq_bit(bit)) {
+-		spin_unlock_irq(&rtc_lock);
++	if (hpet_mask_rtc_irq_bit(bit))
+ 		return;
+-	}
+ 	val = CMOS_READ(RTC_CONTROL);
+ 	val &=  ~bit;
+ 	CMOS_WRITE(val, RTC_CONTROL);
+ 	CMOS_READ(RTC_INTR_FLAGS);
+ 
+ 	rtc_irq_data = 0;
+-	spin_unlock_irq(&rtc_lock);
+ }
+ 
+-static void set_rtc_irq_bit(unsigned char bit)
++static void set_rtc_irq_bit_locked(unsigned char bit)
+ {
+ 	unsigned char val;
+ 
+-	spin_lock_irq(&rtc_lock);
+-	if (hpet_set_rtc_irq_bit(bit)) {
+-		spin_unlock_irq(&rtc_lock);
++	if (hpet_set_rtc_irq_bit(bit))
+ 		return;
+-	}
+ 	val = CMOS_READ(RTC_CONTROL);
+ 	val |= bit;
+ 	CMOS_WRITE(val, RTC_CONTROL);
+ 	CMOS_READ(RTC_INTR_FLAGS);
+ 
+ 	rtc_irq_data = 0;
+-	spin_unlock_irq(&rtc_lock);
+ }
+ #endif
+ 
+diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c
+index 53cc2b6..0b0f47c 100644
+--- a/drivers/hwmon/it87.c
++++ b/drivers/hwmon/it87.c
+@@ -522,8 +522,15 @@ static ssize_t set_fan_min(struct device
+ 	struct i2c_client *client = to_i2c_client(dev);
+ 	struct it87_data *data = i2c_get_clientdata(client);
+ 	int val = simple_strtol(buf, NULL, 10);
++	u8 reg = it87_read_value(client, IT87_REG_FAN_DIV);
+ 
+ 	down(&data->update_lock);
++	switch (nr) {
++	case 0: data->fan_div[nr] = reg & 0x07; break;
++	case 1: data->fan_div[nr] = (reg >> 3) & 0x07; break;
++	case 2: data->fan_div[nr] = (reg & 0x40) ? 3 : 1; break;
++	}
++
+ 	data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
+ 	it87_write_value(client, IT87_REG_FAN_MIN(nr), data->fan_min[nr]);
+ 	up(&data->update_lock);
+diff --git a/drivers/hwmon/lm78.c b/drivers/hwmon/lm78.c
+index f6730dc..b24ee76 100644
+--- a/drivers/hwmon/lm78.c
++++ b/drivers/hwmon/lm78.c
+@@ -451,7 +451,7 @@ static DEVICE_ATTR(fan3_div, S_IRUGO, sh
+ static ssize_t show_vid(struct device *dev, struct device_attribute *attr, char *buf)
+ {
+ 	struct lm78_data *data = lm78_update_device(dev);
+-	return sprintf(buf, "%d\n", vid_from_reg(82, data->vid));
++	return sprintf(buf, "%d\n", vid_from_reg(data->vid, 82));
+ }
+ static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
+ 
+diff --git a/drivers/hwmon/w83627hf.c b/drivers/hwmon/w83627hf.c
+index 3479dc5..b986f91 100644
+--- a/drivers/hwmon/w83627hf.c
++++ b/drivers/hwmon/w83627hf.c
+@@ -454,7 +454,9 @@ static ssize_t store_regs_in_min0(struct
+ 		(w83627thf == data->type || w83637hf == data->type))
+ 
+ 		/* use VRM9 calculation */
+-		data->in_min[0] = (u8)(((val * 100) - 70000 + 244) / 488);
++		data->in_min[0] =
++			SENSORS_LIMIT(((val * 100) - 70000 + 244) / 488, 0,
++					255);
+ 	else
+ 		/* use VRM8 (standard) calculation */
+ 		data->in_min[0] = IN_TO_REG(val);
+@@ -479,7 +481,9 @@ static ssize_t store_regs_in_max0(struct
+ 		(w83627thf == data->type || w83637hf == data->type))
+ 		
+ 		/* use VRM9 calculation */
+-		data->in_max[0] = (u8)(((val * 100) - 70000 + 244) / 488);
++		data->in_max[0] =
++			SENSORS_LIMIT(((val * 100) - 70000 + 244) / 488, 0,
++					255);
+ 	else
+ 		/* use VRM8 (standard) calculation */
+ 		data->in_max[0] = IN_TO_REG(val);
+diff --git a/drivers/isdn/hardware/eicon/os_4bri.c b/drivers/isdn/hardware/eicon/os_4bri.c
+index cccfabc..11e6f93 100644
+--- a/drivers/isdn/hardware/eicon/os_4bri.c
++++ b/drivers/isdn/hardware/eicon/os_4bri.c
+@@ -16,6 +16,7 @@
+ #include "diva_pci.h"
+ #include "mi_pc.h"
+ #include "dsrv4bri.h"
++#include "helpers.h"
+ 
+ static void *diva_xdiLoadFileFile = NULL;
+ static dword diva_xdiLoadFileLength = 0;
+@@ -815,7 +816,7 @@ diva_4bri_cmd_card_proc(struct _diva_os_
+ 	return (ret);
+ }
+ 
+-void *xdiLoadFile(char *FileName, unsigned long *FileLength,
++void *xdiLoadFile(char *FileName, dword *FileLength,
+ 		  unsigned long lim)
+ {
+ 	void *ret = diva_xdiLoadFileFile;
+diff --git a/drivers/net/wan/hdlc_cisco.c b/drivers/net/wan/hdlc_cisco.c
+index a01efa6..1fd0466 100644
+--- a/drivers/net/wan/hdlc_cisco.c
++++ b/drivers/net/wan/hdlc_cisco.c
+@@ -192,7 +192,9 @@ static int cisco_rx(struct sk_buff *skb)
+ 					       "uptime %ud%uh%um%us)\n",
+ 					       dev->name, days, hrs,
+ 					       min, sec);
++#if 0
+ 					netif_carrier_on(dev);
++#endif
+ 					hdlc->state.cisco.up = 1;
+ 				}
+ 			}
+@@ -225,7 +227,9 @@ static void cisco_timer(unsigned long ar
+ 		       hdlc->state.cisco.settings.timeout * HZ)) {
+ 		hdlc->state.cisco.up = 0;
+ 		printk(KERN_INFO "%s: Link down\n", dev->name);
++#if 0
+ 		netif_carrier_off(dev);
++#endif
+ 	}
+ 
+ 	cisco_keepalive_send(dev, CISCO_KEEPALIVE_REQ,
+@@ -261,8 +265,10 @@ static void cisco_stop(struct net_device
+ {
+ 	hdlc_device *hdlc = dev_to_hdlc(dev);
+ 	del_timer_sync(&hdlc->state.cisco.timer);
++#if 0
+ 	if (netif_carrier_ok(dev))
+ 		netif_carrier_off(dev);
++#endif
+ 	hdlc->state.cisco.up = 0;
+ 	hdlc->state.cisco.request_sent = 0;
+ }
+diff --git a/drivers/net/wan/hdlc_fr.c b/drivers/net/wan/hdlc_fr.c
+index a5d6891..5cb399f 100644
+--- a/drivers/net/wan/hdlc_fr.c
++++ b/drivers/net/wan/hdlc_fr.c
+@@ -545,8 +545,10 @@ static void fr_set_link_state(int reliab
+ 
+ 	hdlc->state.fr.reliable = reliable;
+ 	if (reliable) {
++#if 0
+ 		if (!netif_carrier_ok(dev))
+ 			netif_carrier_on(dev);
++#endif
+ 
+ 		hdlc->state.fr.n391cnt = 0; /* Request full status */
+ 		hdlc->state.fr.dce_changed = 1;
+@@ -560,8 +562,10 @@ static void fr_set_link_state(int reliab
+ 			}
+ 		}
+ 	} else {
++#if 0
+ 		if (netif_carrier_ok(dev))
+ 			netif_carrier_off(dev);
++#endif
+ 
+ 		while (pvc) {		/* Deactivate all PVCs */
+ 			pvc_carrier(0, pvc);
+diff --git a/drivers/net/wan/hdlc_generic.c b/drivers/net/wan/hdlc_generic.c
+index cdd4c09..46cef8f 100644
+--- a/drivers/net/wan/hdlc_generic.c
++++ b/drivers/net/wan/hdlc_generic.c
+@@ -79,11 +79,13 @@ static void __hdlc_set_carrier_on(struct
+ 	hdlc_device *hdlc = dev_to_hdlc(dev);
+ 	if (hdlc->proto.start)
+ 		return hdlc->proto.start(dev);
++#if 0
+ #ifdef DEBUG_LINK
+ 	if (netif_carrier_ok(dev))
+ 		printk(KERN_ERR "hdlc_set_carrier_on(): already on\n");
+ #endif
+ 	netif_carrier_on(dev);
++#endif
+ }
+ 
+ 
+@@ -94,11 +96,13 @@ static void __hdlc_set_carrier_off(struc
+ 	if (hdlc->proto.stop)
+ 		return hdlc->proto.stop(dev);
+ 
++#if 0
+ #ifdef DEBUG_LINK
+ 	if (!netif_carrier_ok(dev))
+ 		printk(KERN_ERR "hdlc_set_carrier_off(): already off\n");
+ #endif
+ 	netif_carrier_off(dev);
++#endif
+ }
+ 
+ 
+@@ -294,8 +298,10 @@ int register_hdlc_device(struct net_devi
+ 	if (result != 0)
+ 		return -EIO;
+ 
++#if 0
+ 	if (netif_carrier_ok(dev))
+ 		netif_carrier_off(dev); /* no carrier until DCD goes up */
++#endif
+ 
+ 	return 0;
+ }
+diff --git a/fs/locks.c b/fs/locks.c
+index f7daa5f..accbc3c 100644
+--- a/fs/locks.c
++++ b/fs/locks.c
+@@ -1418,7 +1418,7 @@ int fcntl_setlease(unsigned int fd, stru
+ 	lock_kernel();
+ 
+ 	error = __setlease(filp, arg, &flp);
+-	if (error)
++	if (error || arg == F_UNLCK)
+ 		goto out_unlock;
+ 
+ 	error = fasync_helper(fd, filp, 1, &flp->fl_fasync);
+diff --git a/include/net/ipv6.h b/include/net/ipv6.h
+index 65ec866..53c76c8 100644
+--- a/include/net/ipv6.h
++++ b/include/net/ipv6.h
+@@ -237,6 +237,8 @@ extern struct ipv6_txoptions *	ipv6_rene
+ 						   int newtype,
+ 						   struct ipv6_opt_hdr __user *newopt,
+ 						   int newoptlen);
++struct ipv6_txoptions *ipv6_fixup_options(struct ipv6_txoptions *opt_space,
++					  struct ipv6_txoptions *opt);
+ 
+ extern int ip6_frag_nqueues;
+ extern atomic_t ip6_frag_mem;
+diff --git a/kernel/signal.c b/kernel/signal.c
+index 6904bbb..0d755c6 100644
+--- a/kernel/signal.c
++++ b/kernel/signal.c
+@@ -1524,7 +1524,7 @@ void do_notify_parent(struct task_struct
+ 
+ 	psig = tsk->parent->sighand;
+ 	spin_lock_irqsave(&psig->siglock, flags);
+-	if (sig == SIGCHLD &&
++	if (!tsk->ptrace && sig == SIGCHLD &&
+ 	    (psig->action[SIGCHLD-1].sa.sa_handler == SIG_IGN ||
+ 	     (psig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDWAIT))) {
+ 		/*
+diff --git a/net/ipv4/netfilter/ip_conntrack_ftp.c b/net/ipv4/netfilter/ip_conntrack_ftp.c
+index d77d6b3..59e12b0 100644
+--- a/net/ipv4/netfilter/ip_conntrack_ftp.c
++++ b/net/ipv4/netfilter/ip_conntrack_ftp.c
+@@ -29,9 +29,9 @@ static char *ftp_buffer;
+ static DEFINE_SPINLOCK(ip_ftp_lock);
+ 
+ #define MAX_PORTS 8
+-static short ports[MAX_PORTS];
++static unsigned short ports[MAX_PORTS];
+ static int ports_c;
+-module_param_array(ports, short, &ports_c, 0400);
++module_param_array(ports, ushort, &ports_c, 0400);
+ 
+ static int loose;
+ module_param(loose, int, 0600);
+diff --git a/net/ipv4/netfilter/ip_conntrack_irc.c b/net/ipv4/netfilter/ip_conntrack_irc.c
+index 1545741..2dea1db 100644
+--- a/net/ipv4/netfilter/ip_conntrack_irc.c
++++ b/net/ipv4/netfilter/ip_conntrack_irc.c
+@@ -34,7 +34,7 @@
+ #include <linux/moduleparam.h>
+ 
+ #define MAX_PORTS 8
+-static short ports[MAX_PORTS];
++static unsigned short ports[MAX_PORTS];
+ static int ports_c;
+ static int max_dcc_channels = 8;
+ static unsigned int dcc_timeout = 300;
+@@ -52,7 +52,7 @@ EXPORT_SYMBOL_GPL(ip_nat_irc_hook);
+ MODULE_AUTHOR("Harald Welte <laforge at netfilter.org>");
+ MODULE_DESCRIPTION("IRC (DCC) connection tracking helper");
+ MODULE_LICENSE("GPL");
+-module_param_array(ports, short, &ports_c, 0400);
++module_param_array(ports, ushort, &ports_c, 0400);
+ MODULE_PARM_DESC(ports, "port numbers of IRC servers");
+ module_param(max_dcc_channels, int, 0400);
+ MODULE_PARM_DESC(max_dcc_channels, "max number of expected DCC channels per IRC session");
+diff --git a/net/ipv4/netfilter/ip_conntrack_netlink.c b/net/ipv4/netfilter/ip_conntrack_netlink.c
+index 166e606..97fab76 100644
+--- a/net/ipv4/netfilter/ip_conntrack_netlink.c
++++ b/net/ipv4/netfilter/ip_conntrack_netlink.c
+@@ -58,14 +58,17 @@ ctnetlink_dump_tuples_proto(struct sk_bu
+ 			    const struct ip_conntrack_tuple *tuple)
+ {
+ 	struct ip_conntrack_protocol *proto;
++	int ret = 0;
+ 
+ 	NFA_PUT(skb, CTA_PROTO_NUM, sizeof(u_int8_t), &tuple->dst.protonum);
+ 
+ 	proto = ip_conntrack_proto_find_get(tuple->dst.protonum);
+-	if (proto && proto->tuple_to_nfattr)
+-		return proto->tuple_to_nfattr(skb, tuple);
++	if (likely(proto && proto->tuple_to_nfattr)) {
++		ret = proto->tuple_to_nfattr(skb, tuple);
++		ip_conntrack_proto_put(proto);
++	}
+ 
+-	return 0;
++	return ret;
+ 
+ nfattr_failure:
+ 	return -1;
+diff --git a/net/ipv4/netfilter/ip_conntrack_proto_icmp.c b/net/ipv4/netfilter/ip_conntrack_proto_icmp.c
+index 98f0015..838d1d6 100644
+--- a/net/ipv4/netfilter/ip_conntrack_proto_icmp.c
++++ b/net/ipv4/netfilter/ip_conntrack_proto_icmp.c
+@@ -296,7 +296,8 @@ static int icmp_nfattr_to_tuple(struct n
+ 				struct ip_conntrack_tuple *tuple)
+ {
+ 	if (!tb[CTA_PROTO_ICMP_TYPE-1]
+-	    || !tb[CTA_PROTO_ICMP_CODE-1])
++	    || !tb[CTA_PROTO_ICMP_CODE-1]
++	    || !tb[CTA_PROTO_ICMP_ID-1])
+ 		return -1;
+ 
+ 	tuple->dst.u.icmp.type = 
+diff --git a/net/ipv4/netfilter/ip_conntrack_proto_tcp.c b/net/ipv4/netfilter/ip_conntrack_proto_tcp.c
+index d6701ca..0658e8f 100644
+--- a/net/ipv4/netfilter/ip_conntrack_proto_tcp.c
++++ b/net/ipv4/netfilter/ip_conntrack_proto_tcp.c
+@@ -362,6 +362,11 @@ static int nfattr_to_tcp(struct nfattr *
+ 	struct nfattr *attr = cda[CTA_PROTOINFO_TCP-1];
+ 	struct nfattr *tb[CTA_PROTOINFO_TCP_MAX];
+ 
++	/* updates could not contain anything about the private
++	 * protocol info, in that case skip the parsing */
++	if (!attr)
++		return 0;
++
+         if (nfattr_parse_nested(tb, CTA_PROTOINFO_TCP_MAX, attr) < 0)
+                 goto nfattr_failure;
+ 
+@@ -813,6 +818,7 @@ static u8 tcp_valid_flags[(TH_FIN|TH_SYN
+ {
+ 	[TH_SYN]			= 1,
+ 	[TH_SYN|TH_ACK]			= 1,
++	[TH_SYN|TH_PUSH]		= 1,
+ 	[TH_SYN|TH_ACK|TH_PUSH]		= 1,
+ 	[TH_RST]			= 1,
+ 	[TH_RST|TH_ACK]			= 1,
+diff --git a/net/ipv4/netfilter/ip_conntrack_tftp.c b/net/ipv4/netfilter/ip_conntrack_tftp.c
+index a78736b..d3c5a37 100644
+--- a/net/ipv4/netfilter/ip_conntrack_tftp.c
++++ b/net/ipv4/netfilter/ip_conntrack_tftp.c
+@@ -26,9 +26,9 @@ MODULE_DESCRIPTION("tftp connection trac
+ MODULE_LICENSE("GPL");
+ 
+ #define MAX_PORTS 8
+-static short ports[MAX_PORTS];
++static unsigned short ports[MAX_PORTS];
+ static int ports_c;
+-module_param_array(ports, short, &ports_c, 0400);
++module_param_array(ports, ushort, &ports_c, 0400);
+ MODULE_PARM_DESC(ports, "port numbers of tftp servers");
+ 
+ #if 0
+diff --git a/net/ipv4/netfilter/ip_nat_core.c b/net/ipv4/netfilter/ip_nat_core.c
+index c5e3abd..762f4d9 100644
+--- a/net/ipv4/netfilter/ip_nat_core.c
++++ b/net/ipv4/netfilter/ip_nat_core.c
+@@ -66,10 +66,8 @@ ip_nat_proto_find_get(u_int8_t protonum)
+ 	 * removed until we've grabbed the reference */
+ 	preempt_disable();
+ 	p = __ip_nat_proto_find(protonum);
+-	if (p) {
+-		if (!try_module_get(p->me))
+-			p = &ip_nat_unknown_protocol;
+-	}
++	if (!try_module_get(p->me))
++		p = &ip_nat_unknown_protocol;
+ 	preempt_enable();
+ 
+ 	return p;
+diff --git a/net/ipv4/netfilter/ip_nat_helper_pptp.c b/net/ipv4/netfilter/ip_nat_helper_pptp.c
+index 3cdd068..56e29fa 100644
+--- a/net/ipv4/netfilter/ip_nat_helper_pptp.c
++++ b/net/ipv4/netfilter/ip_nat_helper_pptp.c
+@@ -73,6 +73,7 @@ static void pptp_nat_expected(struct ip_
+ 	struct ip_conntrack_tuple t;
+ 	struct ip_ct_pptp_master *ct_pptp_info;
+ 	struct ip_nat_pptp *nat_pptp_info;
++	struct ip_nat_range range;
+ 
+ 	ct_pptp_info = &master->help.ct_pptp_info;
+ 	nat_pptp_info = &master->nat.help.nat_pptp_info;
+@@ -110,7 +111,30 @@ static void pptp_nat_expected(struct ip_
+ 		DEBUGP("not found!\n");
+ 	}
+ 
+-	ip_nat_follow_master(ct, exp);
++	/* This must be a fresh one. */
++	BUG_ON(ct->status & IPS_NAT_DONE_MASK);
++
++	/* Change src to where master sends to */
++	range.flags = IP_NAT_RANGE_MAP_IPS;
++	range.min_ip = range.max_ip
++		= ct->master->tuplehash[!exp->dir].tuple.dst.ip;
++	if (exp->dir == IP_CT_DIR_ORIGINAL) {
++		range.flags |= IP_NAT_RANGE_PROTO_SPECIFIED;
++		range.min = range.max = exp->saved_proto;
++	}
++	/* hook doesn't matter, but it has to do source manip */
++	ip_nat_setup_info(ct, &range, NF_IP_POST_ROUTING);
++
++	/* For DST manip, map port here to where it's expected. */
++	range.flags = IP_NAT_RANGE_MAP_IPS;
++	range.min_ip = range.max_ip
++		= ct->master->tuplehash[!exp->dir].tuple.src.ip;
++	if (exp->dir == IP_CT_DIR_REPLY) {
++		range.flags |= IP_NAT_RANGE_PROTO_SPECIFIED;
++		range.min = range.max = exp->saved_proto;
++	}
++	/* hook doesn't matter, but it has to do destination manip */
++	ip_nat_setup_info(ct, &range, NF_IP_PRE_ROUTING);
+ }
+ 
+ /* outbound packets == from PNS to PAC */
+@@ -213,7 +237,7 @@ pptp_exp_gre(struct ip_conntrack_expect 
+ 
+ 	/* alter expectation for PNS->PAC direction */
+ 	invert_tuplepr(&inv_t, &expect_orig->tuple);
+-	expect_orig->saved_proto.gre.key = htons(nat_pptp_info->pac_call_id);
++	expect_orig->saved_proto.gre.key = htons(ct_pptp_info->pns_call_id);
+ 	expect_orig->tuple.src.u.gre.key = htons(nat_pptp_info->pns_call_id);
+ 	expect_orig->tuple.dst.u.gre.key = htons(ct_pptp_info->pac_call_id);
+ 	inv_t.src.ip = reply_t->src.ip;
+diff --git a/net/ipv4/netfilter/ip_nat_proto_gre.c b/net/ipv4/netfilter/ip_nat_proto_gre.c
+index 7c12854..f7cad7c 100644
+--- a/net/ipv4/netfilter/ip_nat_proto_gre.c
++++ b/net/ipv4/netfilter/ip_nat_proto_gre.c
+@@ -139,8 +139,8 @@ gre_manip_pkt(struct sk_buff **pskb,
+ 			break;
+ 		case GRE_VERSION_PPTP:
+ 			DEBUGP("call_id -> 0x%04x\n", 
+-				ntohl(tuple->dst.u.gre.key));
+-			pgreh->call_id = htons(ntohl(tuple->dst.u.gre.key));
++				ntohs(tuple->dst.u.gre.key));
++			pgreh->call_id = tuple->dst.u.gre.key;
+ 			break;
+ 		default:
+ 			DEBUGP("can't nat unknown GRE version\n");
+diff --git a/net/ipv4/netfilter/ip_nat_proto_unknown.c b/net/ipv4/netfilter/ip_nat_proto_unknown.c
+index 99bbef5..f0099a6 100644
+--- a/net/ipv4/netfilter/ip_nat_proto_unknown.c
++++ b/net/ipv4/netfilter/ip_nat_proto_unknown.c
+@@ -62,7 +62,7 @@ unknown_print_range(char *buffer, const 
+ 
+ struct ip_nat_protocol ip_nat_unknown_protocol = {
+ 	.name			= "unknown",
+-	.me			= THIS_MODULE,
++	/* .me isn't set: getting a ref to this cannot fail. */
+ 	.manip_pkt		= unknown_manip_pkt,
+ 	.in_range		= unknown_in_range,
+ 	.unique_tuple		= unknown_unique_tuple,
+diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c
+index cc51840..c4a3a99 100644
+--- a/net/ipv6/datagram.c
++++ b/net/ipv6/datagram.c
+@@ -437,7 +437,7 @@ int datagram_recv_ctl(struct sock *sk, s
+ 				break;
+ 			case IPPROTO_AH:
+ 				nexthdr = ptr[0];
+-				len = (ptr[1] + 1) << 2;
++				len = (ptr[1] + 2) << 2;
+ 				break;
+ 			default:
+ 				nexthdr = ptr[0];
+diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c
+index 9225495..be6faf3 100644
+--- a/net/ipv6/exthdrs.c
++++ b/net/ipv6/exthdrs.c
+@@ -628,6 +628,7 @@ ipv6_renew_options(struct sock *sk, stru
+ 	if (!tot_len)
+ 		return NULL;
+ 
++	tot_len += sizeof(*opt2);
+ 	opt2 = sock_kmalloc(sk, tot_len, GFP_ATOMIC);
+ 	if (!opt2)
+ 		return ERR_PTR(-ENOBUFS);
+@@ -668,7 +669,26 @@ ipv6_renew_options(struct sock *sk, stru
+ 
+ 	return opt2;
+ out:
+-	sock_kfree_s(sk, p, tot_len);
++	sock_kfree_s(sk, opt2, opt2->tot_len);
+ 	return ERR_PTR(err);
+ }
+ 
++struct ipv6_txoptions *ipv6_fixup_options(struct ipv6_txoptions *opt_space,
++					  struct ipv6_txoptions *opt)
++{
++	/*
++	 * ignore the dest before srcrt unless srcrt is being included.
++	 * --yoshfuji
++	 */
++	if (opt && opt->dst0opt && !opt->srcrt) {
++		if (opt_space != opt) {
++			memcpy(opt_space, opt, sizeof(*opt_space));
++			opt = opt_space;
++		}
++		opt->opt_nflen -= ipv6_optlen(opt->dst0opt);
++		opt->dst0opt = NULL;
++	}
++
++	return opt;
++}
++
+diff --git a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c
+index bbbe80c..5f3e086 100644
+--- a/net/ipv6/ip6_flowlabel.c
++++ b/net/ipv6/ip6_flowlabel.c
+@@ -225,20 +225,16 @@ struct ipv6_txoptions *fl6_merge_options
+ 					 struct ip6_flowlabel * fl,
+ 					 struct ipv6_txoptions * fopt)
+ {
+-	struct ipv6_txoptions * fl_opt = fl ? fl->opt : NULL;
++	struct ipv6_txoptions * fl_opt = fl->opt;
+ 
+-	if (fopt == NULL || fopt->opt_flen == 0) {
+-		if (!fl_opt || !fl_opt->dst0opt || fl_opt->srcrt)
+-			return fl_opt;
+-	}
++	if (fopt == NULL || fopt->opt_flen == 0)
++		return fl_opt;
+ 
+ 	if (fl_opt != NULL) {
+ 		opt_space->hopopt = fl_opt->hopopt;
+-		opt_space->dst0opt = fl_opt->srcrt ? fl_opt->dst0opt : NULL;
++		opt_space->dst0opt = fl_opt->dst0opt;
+ 		opt_space->srcrt = fl_opt->srcrt;
+ 		opt_space->opt_nflen = fl_opt->opt_nflen;
+-		if (fl_opt->dst0opt && !fl_opt->srcrt)
+-			opt_space->opt_nflen -= ipv6_optlen(fl_opt->dst0opt);
+ 	} else {
+ 		if (fopt->opt_nflen == 0)
+ 			return fopt;
+diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
+index a1265a3..d77d335 100644
+--- a/net/ipv6/raw.c
++++ b/net/ipv6/raw.c
+@@ -756,7 +756,9 @@ static int rawv6_sendmsg(struct kiocb *i
+ 	}
+ 	if (opt == NULL)
+ 		opt = np->opt;
+-	opt = fl6_merge_options(&opt_space, flowlabel, opt);
++	if (flowlabel)
++		opt = fl6_merge_options(&opt_space, flowlabel, opt);
++	opt = ipv6_fixup_options(&opt_space, opt);
+ 
+ 	fl.proto = proto;
+ 	rawv6_probe_proto_opt(&fl, msg);
+diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
+index bf95193..e2b87cc 100644
+--- a/net/ipv6/udp.c
++++ b/net/ipv6/udp.c
+@@ -778,7 +778,9 @@ do_udp_sendmsg:
+ 	}
+ 	if (opt == NULL)
+ 		opt = np->opt;
+-	opt = fl6_merge_options(&opt_space, flowlabel, opt);
++	if (flowlabel)
++		opt = fl6_merge_options(&opt_space, flowlabel, opt);
++	opt = ipv6_fixup_options(&opt_space, opt);
+ 
+ 	fl->proto = IPPROTO_UDP;
+ 	ipv6_addr_copy(&fl->fl6_dst, daddr);
+diff --git a/net/netfilter/nf_queue.c b/net/netfilter/nf_queue.c
+index d10d552..d3a4f30 100644
+--- a/net/netfilter/nf_queue.c
++++ b/net/netfilter/nf_queue.c
+@@ -117,7 +117,7 @@ int nf_queue(struct sk_buff **skb, 
+ 
+ 	/* QUEUE == DROP if noone is waiting, to be safe. */
+ 	read_lock(&queue_handler_lock);
+-	if (!queue_handler[pf]->outfn) {
++	if (!queue_handler[pf] || !queue_handler[pf]->outfn) {
+ 		read_unlock(&queue_handler_lock);
+ 		kfree_skb(*skb);
+ 		return 1;

Modified: dists/sid/linux-2.6/debian/patches-debian/series/2.6.14-4
==============================================================================
--- dists/sid/linux-2.6/debian/patches-debian/series/2.6.14-4	(original)
+++ dists/sid/linux-2.6/debian/patches-debian/series/2.6.14-4	Fri Nov 25 22:28:54 2005
@@ -2,3 +2,4 @@
 + setkeys-needs-root-2.patch
 + mm-invalidate_inode_pages2-overflow.patch
 + ctnetlink-check-if-protoinfo-is-present.patch
++ 2.6.14.3.patch



More information about the Kernel-svn-changes mailing list