[kernel] r8059 - in dists/sid/linux-2.6/debian: . patches/bugfix
patches/series
maximilian attems
maks-guest at alioth.debian.org
Sat Dec 30 09:10:43 UTC 2006
Author: maks-guest
Date: Sat Dec 30 10:10:42 2006
New Revision: 8059
Added:
dists/sid/linux-2.6/debian/patches/bugfix/2.6.18.6
Removed:
dists/sid/linux-2.6/debian/patches/bugfix/2.6.16.36
dists/sid/linux-2.6/debian/patches/bugfix/dm-crypt-fix-data-corruption-with-dm-crypt-over-raid5.patch
Modified:
dists/sid/linux-2.6/debian/changelog
dists/sid/linux-2.6/debian/patches/bugfix/2.6.16.35
dists/sid/linux-2.6/debian/patches/bugfix/2.6.16.37
dists/sid/linux-2.6/debian/patches/series/9
Log:
add latest 2.6.18.6 stable release,
prefer it's fixes over 2.6.16.X and other backports
Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog (original)
+++ dists/sid/linux-2.6/debian/changelog Sat Dec 30 10:10:42 2006
@@ -19,7 +19,6 @@
* Build only the pae version of xen. (closes: #390862)
[ dann frazier ]
- * Fix data corruption with dm-crypt over RAID5 (closes: #402812)
* Fix potential fragmentation attacks in ip6_tables (CVE-2006-4572)
* Backport a number of fixes for the cciss driver
- Fix a bug with 1TB disks caused by converting total_size to an int
@@ -52,6 +51,32 @@
* m68k/atari: fixes for ethernec and video driver by Michael Schmitz
[ maximilian attems ]
+ * Add stable release 2.6.18.6:
+ - EBTABLES: Fix wraparounds in ebt_entries verification.
+ - EBTABLES: Verify that ebt_entries have zero ->distinguisher.
+ - EBTABLES: Deal with the worst-case behaviour in loop checks.
+ - EBTABLES: Prevent wraparounds in checks for entry components' sizes.
+ - skip data conversion in compat_sys_mount when data_page is NULL
+ - bonding: incorrect bonding state reported via ioctl
+ - x86-64: Mark rdtsc as sync only for netburst, not for core2
+ - dm crypt: Fix data corruption with dm-crypt over RAID5 (closes: #402812)
+ - forcedeth: Disable INTx when enabling MSI in forcedeth
+ - PKT_SCHED act_gact: division by zero
+ - XFRM: Use output device disable_xfrm for forwarded packets
+ - IPSEC: Fix inetpeer leak in ipv4 xfrm dst entries.
+ - V4L: Fix broken TUNER_LG_NTSC_TAPE radio support
+ - m32r: make userspace headers platform-independent
+ - IrDA: Incorrect TTP header reservation
+ - SUNHME: Fix for sunhme failures on x86
+ - Bluetooth: Add packet size checks for CAPI messages (CVE-2006-6106)
+ - softmac: remove netif_tx_disable when scanning
+ - DVB: lgdt330x: fix signal / lock status detection bug
+ - dm snapshot: fix freeing pending exception
+ - NET_SCHED: policer: restore compatibility with old iproute binaries
+ - NETFILTER: ip_tables: revision support for compat code
+ - ARM: Add sys_*at syscalls
+ - ieee1394: ohci1394: add PPC_PMAC platform code to driver probe
+ - softirq: remove BUG_ONs which can incorrectly trigger
* Hand-picked from stable release 2.6.16.30:
- [PPPOE]: Advertise PPPoE MTU
* Hand-picked from stable release 2.6.16.31:
@@ -71,22 +96,10 @@
- sgiioc4: Disable module unload
- Fix a masking bug in the 6pack driver.
- drivers/usb/input/ati_remote.c: fix cut'n'paste error
- - [EBTABLES]: Prevent wraparounds in checks for entry components' sizes.
- - [EBTABLES]: Deal with the worst-case behaviour in loop checks.
- - [EBTABLES]: Verify that ebt_entries have zero ->distinguisher.
- - [EBTABLES]: Fix wraparounds in ebt_entries verification.
- - [PKT_SCHED] act_gact: division by zero
- - [NET_SCHED]: policer: restore compatibility with old iproute binaries
- proper flags type of spin_lock_irqsave()
- * Hand-picked from stable release 2.6.16.36:
- - [IPSEC]: Fix inetpeer leak in ipv4 xfrm dst entries.
- - [XFRM]: Use output device disable_xfrm for forwarded packets
* Hand-picked from stable release 2.6.16.37:
- - x86-64: Mark rdtsc as sync only for netburst, not for core2
- [CRYPTO] sha512: Fix sha384 block size
- - DVB: lgdt330x: fix signal / lock status detection bug
- [SCSI] gdth: Fix && typos
- - softirq: remove BUG_ONs which can incorrectly trigger
- Fix SUNRPC wakeup/execute race condition
* Enable DEBUG_FS for usbmon in generic config. Don't disable it on alpha,
amd64, hppa and ia64. (closes: 378542)
@@ -108,7 +121,7 @@
memory accesses in ehci-hub-control() by adding an alignment attribute
to the tbuf array declaration. Thanks to David Miller for the patch.
- -- maximilian attems <maks at sternwelten.at> Fri, 29 Dec 2006 15:23:33 +0100
+ -- maximilian attems <maks at sternwelten.at> Sat, 30 Dec 2006 09:27:10 +0100
linux-2.6 (2.6.18-8) unstable; urgency=low
Modified: dists/sid/linux-2.6/debian/patches/bugfix/2.6.16.35
==============================================================================
--- dists/sid/linux-2.6/debian/patches/bugfix/2.6.16.35 (original)
+++ dists/sid/linux-2.6/debian/patches/bugfix/2.6.16.35 Sat Dec 30 10:10:42 2006
@@ -303,256 +303,6 @@
spin_lock_irqsave(&sem->sentry, flags);
if (sem->count < 0) {
__up(sem);
-diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c
-index cbd4020..8171fea 100644
---- a/net/bridge/netfilter/ebtables.c
-+++ b/net/bridge/netfilter/ebtables.c
-@@ -359,10 +359,11 @@ ebt_check_match(struct ebt_entry_match *m, struct ebt_entry *e,
- const char *name, unsigned int hookmask, unsigned int *cnt)
- {
- struct ebt_match *match;
-+ size_t left = ((char *)e + e->watchers_offset) - (char *)m;
- int ret;
-
-- if (((char *)m) + m->match_size + sizeof(struct ebt_entry_match) >
-- ((char *)e) + e->watchers_offset)
-+ if (left < sizeof(struct ebt_entry_match) ||
-+ left - sizeof(struct ebt_entry_match) < m->match_size)
- return -EINVAL;
- match = find_match_lock(m->u.name, &ret, &ebt_mutex);
- if (!match)
-@@ -388,10 +389,11 @@ ebt_check_watcher(struct ebt_entry_watcher *w, struct ebt_entry *e,
- const char *name, unsigned int hookmask, unsigned int *cnt)
- {
- struct ebt_watcher *watcher;
-+ size_t left = ((char *)e + e->target_offset) - (char *)w;
- int ret;
-
-- if (((char *)w) + w->watcher_size + sizeof(struct ebt_entry_watcher) >
-- ((char *)e) + e->target_offset)
-+ if (left < sizeof(struct ebt_entry_watcher) ||
-+ left - sizeof(struct ebt_entry_watcher) < w->watcher_size)
- return -EINVAL;
- watcher = find_watcher_lock(w->u.name, &ret, &ebt_mutex);
- if (!watcher)
-@@ -422,19 +424,23 @@ ebt_check_entry_size_and_hooks(struct ebt_entry *e,
- struct ebt_entries **hook_entries, unsigned int *n, unsigned int *cnt,
- unsigned int *totalcnt, unsigned int *udc_cnt, unsigned int valid_hooks)
- {
-+ unsigned int offset = (char *)e - newinfo->entries;
-+ size_t left = (limit - base) - offset;
- int i;
-
-+ if (left < sizeof(unsigned int))
-+ goto Esmall;
-+
- for (i = 0; i < NF_BR_NUMHOOKS; i++) {
- if ((valid_hooks & (1 << i)) == 0)
- continue;
-- if ( (char *)hook_entries[i] - base ==
-- (char *)e - newinfo->entries)
-+ if ((char *)hook_entries[i] == base + offset)
- break;
- }
- /* beginning of a new chain
- if i == NF_BR_NUMHOOKS it must be a user defined chain */
- if (i != NF_BR_NUMHOOKS || !(e->bitmask & EBT_ENTRY_OR_ENTRIES)) {
-- if ((e->bitmask & EBT_ENTRY_OR_ENTRIES) != 0) {
-+ if (e->bitmask != 0) {
- /* we make userspace set this right,
- so there is no misunderstanding */
- BUGPRINT("EBT_ENTRY_OR_ENTRIES shouldn't be set "
-@@ -449,11 +455,8 @@ ebt_check_entry_size_and_hooks(struct ebt_entry *e,
- return -EINVAL;
- }
- /* before we look at the struct, be sure it is not too big */
-- if ((char *)hook_entries[i] + sizeof(struct ebt_entries)
-- > limit) {
-- BUGPRINT("entries_size too small\n");
-- return -EINVAL;
-- }
-+ if (left < sizeof(struct ebt_entries))
-+ goto Esmall;
- if (((struct ebt_entries *)e)->policy != EBT_DROP &&
- ((struct ebt_entries *)e)->policy != EBT_ACCEPT) {
- /* only RETURN from udc */
-@@ -476,6 +479,8 @@ ebt_check_entry_size_and_hooks(struct ebt_entry *e,
- return 0;
- }
- /* a plain old entry, heh */
-+ if (left < sizeof(struct ebt_entry))
-+ goto Esmall;
- if (sizeof(struct ebt_entry) > e->watchers_offset ||
- e->watchers_offset > e->target_offset ||
- e->target_offset >= e->next_offset) {
-@@ -487,10 +492,16 @@ ebt_check_entry_size_and_hooks(struct ebt_entry *e,
- BUGPRINT("target size too small\n");
- return -EINVAL;
- }
-+ if (left < e->next_offset)
-+ goto Esmall;
-
- (*cnt)++;
- (*totalcnt)++;
- return 0;
-+
-+Esmall:
-+ BUGPRINT("entries_size too small\n");
-+ return -EINVAL;
- }
-
- struct ebt_cl_stack
-@@ -512,7 +523,7 @@ ebt_get_udc_positions(struct ebt_entry *e, struct ebt_table_info *newinfo,
- int i;
-
- /* we're only interested in chain starts */
-- if (e->bitmask & EBT_ENTRY_OR_ENTRIES)
-+ if (e->bitmask)
- return 0;
- for (i = 0; i < NF_BR_NUMHOOKS; i++) {
- if ((valid_hooks & (1 << i)) == 0)
-@@ -562,7 +573,7 @@ ebt_cleanup_entry(struct ebt_entry *e, unsigned int *cnt)
- {
- struct ebt_entry_target *t;
-
-- if ((e->bitmask & EBT_ENTRY_OR_ENTRIES) == 0)
-+ if (e->bitmask == 0)
- return 0;
- /* we're done */
- if (cnt && (*cnt)-- == 0)
-@@ -585,10 +596,11 @@ ebt_check_entry(struct ebt_entry *e, struct ebt_table_info *newinfo,
- struct ebt_entry_target *t;
- struct ebt_target *target;
- unsigned int i, j, hook = 0, hookmask = 0;
-+ size_t gap = e->next_offset - e->target_offset;
- int ret;
-
- /* don't mess with the struct ebt_entries */
-- if ((e->bitmask & EBT_ENTRY_OR_ENTRIES) == 0)
-+ if (e->bitmask == 0)
- return 0;
-
- if (e->bitmask & ~EBT_F_MASK) {
-@@ -646,8 +658,7 @@ ebt_check_entry(struct ebt_entry *e, struct ebt_table_info *newinfo,
-
- t->u.target = target;
- if (t->u.target == &ebt_standard_target) {
-- if (e->target_offset + sizeof(struct ebt_standard_target) >
-- e->next_offset) {
-+ if (gap < sizeof(struct ebt_standard_target)) {
- BUGPRINT("Standard target size too big\n");
- ret = -EFAULT;
- goto cleanup_watchers;
-@@ -658,8 +669,7 @@ ebt_check_entry(struct ebt_entry *e, struct ebt_table_info *newinfo,
- ret = -EFAULT;
- goto cleanup_watchers;
- }
-- } else if ((e->target_offset + t->target_size +
-- sizeof(struct ebt_entry_target) > e->next_offset) ||
-+ } else if (t->target_size > gap - sizeof(struct ebt_entry_target) ||
- (t->u.target->check &&
- t->u.target->check(name, hookmask, e, t->data, t->target_size) != 0)){
- module_put(t->u.target->me);
-@@ -729,7 +739,9 @@ static int check_chainloops(struct ebt_entries *chain, struct ebt_cl_stack *cl_s
- BUGPRINT("loop\n");
- return -1;
- }
-- /* this can't be 0, so the above test is correct */
-+ if (cl_s[i].hookmask & (1 << hooknr))
-+ goto letscontinue;
-+ /* this can't be 0, so the loop test is correct */
- cl_s[i].cs.n = pos + 1;
- pos = 0;
- cl_s[i].cs.e = ((void *)e + e->next_offset);
-@@ -1311,7 +1323,7 @@ static inline int ebt_make_names(struct ebt_entry *e, char *base, char *ubase)
- char *hlp;
- struct ebt_entry_target *t;
-
-- if ((e->bitmask & EBT_ENTRY_OR_ENTRIES) == 0)
-+ if (e->bitmask == 0)
- return 0;
-
- hlp = ubase - base + (char *)e + e->target_offset;
-diff --git a/net/sched/act_gact.c b/net/sched/act_gact.c
-index a1e68f7..d5571ee 100644
---- a/net/sched/act_gact.c
-+++ b/net/sched/act_gact.c
-@@ -55,14 +55,14 @@ static DEFINE_RWLOCK(gact_lock);
- #ifdef CONFIG_GACT_PROB
- static int gact_net_rand(struct tcf_gact *p)
- {
-- if (net_random()%p->pval)
-+ if (!p->pval || net_random()%p->pval)
- return p->action;
- return p->paction;
- }
-
- static int gact_determ(struct tcf_gact *p)
- {
-- if (p->bstats.packets%p->pval)
-+ if (!p->pval || p->bstats.packets%p->pval)
- return p->action;
- return p->paction;
- }
-diff --git a/net/sched/act_police.c b/net/sched/act_police.c
-index fa877f8..f304b1b 100644
---- a/net/sched/act_police.c
-+++ b/net/sched/act_police.c
-@@ -45,6 +45,18 @@ static struct tcf_police *tcf_police_ht[MY_TAB_SIZE];
- /* Policer hash table lock */
- static DEFINE_RWLOCK(police_lock);
-
-+/* old policer structure from before tc actions */
-+struct tc_police_compat
-+{
-+ u32 index;
-+ int action;
-+ u32 limit;
-+ u32 burst;
-+ u32 mtu;
-+ struct tc_ratespec rate;
-+ struct tc_ratespec peakrate;
-+};
-+
- /* Each policer is serialized by its individual spinlock */
-
- static __inline__ unsigned tcf_police_hash(u32 index)
-@@ -170,12 +182,15 @@ static int tcf_act_police_locate(struct rtattr *rta, struct rtattr *est,
- struct tc_police *parm;
- struct tcf_police *p;
- struct qdisc_rate_table *R_tab = NULL, *P_tab = NULL;
-+ int size;
-
- if (rta == NULL || rtattr_parse_nested(tb, TCA_POLICE_MAX, rta) < 0)
- return -EINVAL;
-
-- if (tb[TCA_POLICE_TBF-1] == NULL ||
-- RTA_PAYLOAD(tb[TCA_POLICE_TBF-1]) != sizeof(*parm))
-+ if (tb[TCA_POLICE_TBF-1] == NULL)
-+ return -EINVAL;
-+ size = RTA_PAYLOAD(tb[TCA_POLICE_TBF-1]);
-+ if (size != sizeof(*parm) && size != sizeof(struct tc_police_compat))
- return -EINVAL;
- parm = RTA_DATA(tb[TCA_POLICE_TBF-1]);
-
-@@ -415,12 +430,15 @@ struct tcf_police * tcf_police_locate(struct rtattr *rta, struct rtattr *est)
- struct tcf_police *p;
- struct rtattr *tb[TCA_POLICE_MAX];
- struct tc_police *parm;
-+ int size;
-
- if (rtattr_parse_nested(tb, TCA_POLICE_MAX, rta) < 0)
- return NULL;
-
-- if (tb[TCA_POLICE_TBF-1] == NULL ||
-- RTA_PAYLOAD(tb[TCA_POLICE_TBF-1]) != sizeof(*parm))
-+ if (tb[TCA_POLICE_TBF-1] == NULL)
-+ return NULL;
-+ size = RTA_PAYLOAD(tb[TCA_POLICE_TBF-1]);
-+ if (size != sizeof(*parm) && size != sizeof(struct tc_police_compat))
- return NULL;
-
- parm = RTA_DATA(tb[TCA_POLICE_TBF-1]);
diff --git a/sound/oss/swarm_cs4297a.c b/sound/oss/swarm_cs4297a.c
index df4d377..a1de9dc 100644
--- a/sound/oss/swarm_cs4297a.c
Modified: dists/sid/linux-2.6/debian/patches/bugfix/2.6.16.37
==============================================================================
--- dists/sid/linux-2.6/debian/patches/bugfix/2.6.16.37 (original)
+++ dists/sid/linux-2.6/debian/patches/bugfix/2.6.16.37 Sat Dec 30 10:10:42 2006
@@ -1,19 +1,3 @@
-diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c
-index a4a0bb5..babbbaf 100644
---- a/arch/x86_64/kernel/setup.c
-+++ b/arch/x86_64/kernel/setup.c
-@@ -1050,7 +1050,10 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c)
- if ((c->x86 == 0xf && c->x86_model >= 0x03) ||
- (c->x86 == 0x6 && c->x86_model >= 0x0e))
- set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability);
-- set_bit(X86_FEATURE_SYNC_RDTSC, &c->x86_capability);
-+ if (c->x86 == 15)
-+ set_bit(X86_FEATURE_SYNC_RDTSC, &c->x86_capability);
-+ else
-+ clear_bit(X86_FEATURE_SYNC_RDTSC, &c->x86_capability);
- c->x86_max_cores = intel_num_cpu_cores(c);
-
- srat_detect_node();
diff --git a/crypto/sha512.c b/crypto/sha512.c
index 3e6e939..c957481 100644
--- a/crypto/sha512.c
@@ -27,30 +11,6 @@
#define SHA512_HMAC_BLOCK_SIZE 128
struct sha512_ctx {
-diff --git a/drivers/media/dvb/frontends/lgdt330x.c b/drivers/media/dvb/frontends/lgdt330x.c
-index 4691ac5..8de081b 100644
---- a/drivers/media/dvb/frontends/lgdt330x.c
-+++ b/drivers/media/dvb/frontends/lgdt330x.c
-@@ -433,9 +433,6 @@ static int lgdt3302_read_status(struct dvb_frontend* fe, fe_status_t* status)
- /* Test signal does not exist flag */
- /* as well as the AGC lock flag. */
- *status |= FE_HAS_SIGNAL;
-- } else {
-- /* Without a signal all other status bits are meaningless */
-- return 0;
- }
-
- /*
-@@ -498,9 +495,6 @@ static int lgdt3303_read_status(struct dvb_frontend* fe, fe_status_t* status)
- /* Test input signal does not exist flag */
- /* as well as the AGC lock flag. */
- *status |= FE_HAS_SIGNAL;
-- } else {
-- /* Without a signal all other status bits are meaningless */
-- return 0;
- }
-
- /* Carrier Recovery Lock Status Register */
diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c
index 62e3cda..f6d44b6 100644
--- a/drivers/scsi/gdth.c
@@ -73,19 +33,6 @@
} else
#endif
{
-diff --git a/kernel/softirq.c b/kernel/softirq.c
-index ad3295c..6abbc72 100644
---- a/kernel/softirq.c
-+++ b/kernel/softirq.c
-@@ -454,8 +454,6 @@ static int __devinit cpu_callback(struct notifier_block *nfb,
-
- switch (action) {
- case CPU_UP_PREPARE:
-- BUG_ON(per_cpu(tasklet_vec, hotcpu).list);
-- BUG_ON(per_cpu(tasklet_hi_vec, hotcpu).list);
- p = kthread_create(ksoftirqd, hcpu, "ksoftirqd/%d", hotcpu);
- if (IS_ERR(p)) {
- printk("ksoftirqd for %i failed\n", hotcpu);
diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c
index e838d04..d1c8b47 100644
--- a/net/sunrpc/sched.c
Added: dists/sid/linux-2.6/debian/patches/bugfix/2.6.18.6
==============================================================================
--- (empty file)
+++ dists/sid/linux-2.6/debian/patches/bugfix/2.6.18.6 Sat Dec 30 10:10:42 2006
@@ -0,0 +1,903 @@
+diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S
+index 3173924..e8f7436 100644
+--- a/arch/arm/kernel/calls.S
++++ b/arch/arm/kernel/calls.S
+@@ -331,6 +331,19 @@
+ CALL(sys_mbind)
+ /* 320 */ CALL(sys_get_mempolicy)
+ CALL(sys_set_mempolicy)
++ CALL(sys_openat)
++ CALL(sys_mkdirat)
++ CALL(sys_mknodat)
++/* 325 */ CALL(sys_fchownat)
++ CALL(sys_futimesat)
++ CALL(sys_fstatat64)
++ CALL(sys_unlinkat)
++ CALL(sys_renameat)
++/* 330 */ CALL(sys_linkat)
++ CALL(sys_symlinkat)
++ CALL(sys_readlinkat)
++ CALL(sys_fchmodat)
++ CALL(sys_faccessat)
+ #ifndef syscalls_counted
+ .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
+ #define syscalls_counted
+diff --git a/arch/m32r/kernel/entry.S b/arch/m32r/kernel/entry.S
+index ac6d840..5b01fd2 100644
+--- a/arch/m32r/kernel/entry.S
++++ b/arch/m32r/kernel/entry.S
+@@ -23,35 +23,35 @@
+ * updated in fork.c:copy_thread, signal.c:do_signal,
+ * ptrace.c and ptrace.h
+ *
+- * M32Rx/M32R2 M32R
+- * @(sp) - r4 ditto
+- * @(0x04,sp) - r5 ditto
+- * @(0x08,sp) - r6 ditto
+- * @(0x0c,sp) - *pt_regs ditto
+- * @(0x10,sp) - r0 ditto
+- * @(0x14,sp) - r1 ditto
+- * @(0x18,sp) - r2 ditto
+- * @(0x1c,sp) - r3 ditto
+- * @(0x20,sp) - r7 ditto
+- * @(0x24,sp) - r8 ditto
+- * @(0x28,sp) - r9 ditto
+- * @(0x2c,sp) - r10 ditto
+- * @(0x30,sp) - r11 ditto
+- * @(0x34,sp) - r12 ditto
+- * @(0x38,sp) - syscall_nr ditto
+- * @(0x3c,sp) - acc0h @(0x3c,sp) - acch
+- * @(0x40,sp) - acc0l @(0x40,sp) - accl
+- * @(0x44,sp) - acc1h @(0x44,sp) - dummy_acc1h
+- * @(0x48,sp) - acc1l @(0x48,sp) - dummy_acc1l
+- * @(0x4c,sp) - psw ditto
+- * @(0x50,sp) - bpc ditto
+- * @(0x54,sp) - bbpsw ditto
+- * @(0x58,sp) - bbpc ditto
+- * @(0x5c,sp) - spu (cr3) ditto
+- * @(0x60,sp) - fp (r13) ditto
+- * @(0x64,sp) - lr (r14) ditto
+- * @(0x68,sp) - spi (cr2) ditto
+- * @(0x6c,sp) - orig_r0 ditto
++ * M32R/M32Rx/M32R2
++ * @(sp) - r4
++ * @(0x04,sp) - r5
++ * @(0x08,sp) - r6
++ * @(0x0c,sp) - *pt_regs
++ * @(0x10,sp) - r0
++ * @(0x14,sp) - r1
++ * @(0x18,sp) - r2
++ * @(0x1c,sp) - r3
++ * @(0x20,sp) - r7
++ * @(0x24,sp) - r8
++ * @(0x28,sp) - r9
++ * @(0x2c,sp) - r10
++ * @(0x30,sp) - r11
++ * @(0x34,sp) - r12
++ * @(0x38,sp) - syscall_nr
++ * @(0x3c,sp) - acc0h
++ * @(0x40,sp) - acc0l
++ * @(0x44,sp) - acc1h ; ISA_DSP_LEVEL2 only
++ * @(0x48,sp) - acc1l ; ISA_DSP_LEVEL2 only
++ * @(0x4c,sp) - psw
++ * @(0x50,sp) - bpc
++ * @(0x54,sp) - bbpsw
++ * @(0x58,sp) - bbpc
++ * @(0x5c,sp) - spu (cr3)
++ * @(0x60,sp) - fp (r13)
++ * @(0x64,sp) - lr (r14)
++ * @(0x68,sp) - spi (cr2)
++ * @(0x6c,sp) - orig_r0
+ */
+
+ #include <linux/linkage.h>
+@@ -95,17 +95,10 @@
+ #define R11(reg) @(0x30,reg)
+ #define R12(reg) @(0x34,reg)
+ #define SYSCALL_NR(reg) @(0x38,reg)
+-#if defined(CONFIG_ISA_M32R2) && defined(CONFIG_ISA_DSP_LEVEL2)
+ #define ACC0H(reg) @(0x3C,reg)
+ #define ACC0L(reg) @(0x40,reg)
+ #define ACC1H(reg) @(0x44,reg)
+ #define ACC1L(reg) @(0x48,reg)
+-#elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R)
+-#define ACCH(reg) @(0x3C,reg)
+-#define ACCL(reg) @(0x40,reg)
+-#else
+-#error unknown isa configuration
+-#endif
+ #define PSW(reg) @(0x4C,reg)
+ #define BPC(reg) @(0x50,reg)
+ #define BBPSW(reg) @(0x54,reg)
+diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c
+index 34afad7..ffcb9e4 100644
+--- a/arch/x86_64/kernel/setup.c
++++ b/arch/x86_64/kernel/setup.c
+@@ -1010,7 +1010,10 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c)
+ if ((c->x86 == 0xf && c->x86_model >= 0x03) ||
+ (c->x86 == 0x6 && c->x86_model >= 0x0e))
+ set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability);
+- set_bit(X86_FEATURE_SYNC_RDTSC, &c->x86_capability);
++ if (c->x86 == 15)
++ set_bit(X86_FEATURE_SYNC_RDTSC, &c->x86_capability);
++ else
++ clear_bit(X86_FEATURE_SYNC_RDTSC, &c->x86_capability);
+ c->x86_max_cores = intel_num_cpu_cores(c);
+
+ srat_detect_node();
+diff --git a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c
+index 448df27..ab5a6b5 100644
+--- a/drivers/ieee1394/ohci1394.c
++++ b/drivers/ieee1394/ohci1394.c
+@@ -3218,6 +3218,19 @@ static int __devinit ohci1394_pci_probe(struct pci_dev *dev,
+ struct ti_ohci *ohci; /* shortcut to currently handled device */
+ resource_size_t ohci_base;
+
++#ifdef CONFIG_PPC_PMAC
++ /* Necessary on some machines if ohci1394 was loaded/ unloaded before */
++ if (machine_is(powermac)) {
++ struct device_node *of_node = pci_device_to_OF_node(dev);
++
++ if (of_node) {
++ pmac_call_feature(PMAC_FTR_1394_CABLE_POWER, of_node,
++ 0, 1);
++ pmac_call_feature(PMAC_FTR_1394_ENABLE, of_node, 0, 1);
++ }
++ }
++#endif /* CONFIG_PPC_PMAC */
++
+ if (pci_enable_device(dev))
+ FAIL(-ENXIO, "Failed to enable OHCI hardware");
+ pci_set_master(dev);
+@@ -3506,11 +3519,9 @@ static void ohci1394_pci_remove(struct pci_dev *pdev)
+ #endif
+
+ #ifdef CONFIG_PPC_PMAC
+- /* On UniNorth, power down the cable and turn off the chip
+- * clock when the module is removed to save power on
+- * laptops. Turning it back ON is done by the arch code when
+- * pci_enable_device() is called */
+- {
++ /* On UniNorth, power down the cable and turn off the chip clock
++ * to save power on laptops */
++ if (machine_is(powermac)) {
+ struct device_node* of_node;
+
+ of_node = pci_device_to_OF_node(ohci->dev);
+diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
+index 6022ed1..31e498f 100644
+--- a/drivers/md/dm-crypt.c
++++ b/drivers/md/dm-crypt.c
+@@ -717,13 +717,15 @@ static int crypt_endio(struct bio *bio, unsigned int done, int error)
+ if (bio->bi_size)
+ return 1;
+
++ if (!bio_flagged(bio, BIO_UPTODATE) && !error)
++ error = -EIO;
++
+ bio_put(bio);
+
+ /*
+ * successful reads are decrypted by the worker thread
+ */
+- if ((bio_data_dir(bio) == READ)
+- && bio_flagged(bio, BIO_UPTODATE)) {
++ if (bio_data_dir(io->bio) == READ && !error) {
+ kcryptd_queue_io(io);
+ return 0;
+ }
+diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c
+index 1d0fafd..6578b26 100644
+--- a/drivers/md/dm-snap.c
++++ b/drivers/md/dm-snap.c
+@@ -691,6 +691,7 @@ static void pending_complete(struct pending_exception *pe, int success)
+
+ free_exception(e);
+
++ remove_exception(&pe->e);
+ error_snapshot_bios(pe);
+ goto out;
+ }
+diff --git a/drivers/media/dvb/frontends/lgdt330x.c b/drivers/media/dvb/frontends/lgdt330x.c
+index 9a35470..467f199 100644
+--- a/drivers/media/dvb/frontends/lgdt330x.c
++++ b/drivers/media/dvb/frontends/lgdt330x.c
+@@ -435,9 +435,6 @@ static int lgdt3302_read_status(struct dvb_frontend* fe, fe_status_t* status)
+ /* Test signal does not exist flag */
+ /* as well as the AGC lock flag. */
+ *status |= FE_HAS_SIGNAL;
+- } else {
+- /* Without a signal all other status bits are meaningless */
+- return 0;
+ }
+
+ /*
+@@ -500,9 +497,6 @@ static int lgdt3303_read_status(struct dvb_frontend* fe, fe_status_t* status)
+ /* Test input signal does not exist flag */
+ /* as well as the AGC lock flag. */
+ *status |= FE_HAS_SIGNAL;
+- } else {
+- /* Without a signal all other status bits are meaningless */
+- return 0;
+ }
+
+ /* Carrier Recovery Lock Status Register */
+diff --git a/drivers/media/video/tuner-simple.c b/drivers/media/video/tuner-simple.c
+index abe37cf..a17cc8e 100644
+--- a/drivers/media/video/tuner-simple.c
++++ b/drivers/media/video/tuner-simple.c
+@@ -108,6 +108,7 @@ static int tuner_stereo(struct i2c_client *c)
+ case TUNER_PHILIPS_FM1216ME_MK3:
+ case TUNER_PHILIPS_FM1236_MK3:
+ case TUNER_PHILIPS_FM1256_IH3:
++ case TUNER_LG_NTSC_TAPE:
+ stereo = ((status & TUNER_SIGNAL) == TUNER_STEREO_MK3);
+ break;
+ default:
+@@ -419,6 +420,7 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq)
+ case TUNER_PHILIPS_FM1216ME_MK3:
+ case TUNER_PHILIPS_FM1236_MK3:
+ case TUNER_PHILIPS_FMD1216ME_MK3:
++ case TUNER_LG_NTSC_TAPE:
+ buffer[3] = 0x19;
+ break;
+ case TUNER_TNF_5335MF:
+diff --git a/drivers/media/video/tuner-types.c b/drivers/media/video/tuner-types.c
+index 8b54259..c371159 100644
+--- a/drivers/media/video/tuner-types.c
++++ b/drivers/media/video/tuner-types.c
+@@ -671,16 +671,6 @@ static struct tuner_params tuner_panasonic_vp27_params[] = {
+ },
+ };
+
+-/* ------------ TUNER_LG_NTSC_TAPE - LGINNOTEK NTSC ------------ */
+-
+-static struct tuner_params tuner_lg_ntsc_tape_params[] = {
+- {
+- .type = TUNER_PARAM_TYPE_NTSC,
+- .ranges = tuner_fm1236_mk3_ntsc_ranges,
+- .count = ARRAY_SIZE(tuner_fm1236_mk3_ntsc_ranges),
+- },
+-};
+-
+ /* ------------ TUNER_TNF_8831BGFF - Philips PAL ------------ */
+
+ static struct tuner_range tuner_tnf_8831bgff_pal_ranges[] = {
+@@ -1331,8 +1321,8 @@ struct tunertype tuners[] = {
+ },
+ [TUNER_LG_NTSC_TAPE] = { /* LGINNOTEK NTSC */
+ .name = "LG NTSC (TAPE series)",
+- .params = tuner_lg_ntsc_tape_params,
+- .count = ARRAY_SIZE(tuner_lg_ntsc_tape_params),
++ .params = tuner_fm1236_mk3_params,
++ .count = ARRAY_SIZE(tuner_fm1236_mk3_params),
+ },
+ [TUNER_TNF_8831BGFF] = { /* Philips PAL */
+ .name = "Tenna TNF 8831 BGFF)",
+diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
+index 8b95123..0ece819 100644
+--- a/drivers/net/bonding/bond_main.c
++++ b/drivers/net/bonding/bond_main.c
+@@ -3547,7 +3547,7 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd
+ mii->val_out = 0;
+ read_lock_bh(&bond->lock);
+ read_lock(&bond->curr_slave_lock);
+- if (bond->curr_active_slave) {
++ if (netif_carrier_ok(bond->dev)) {
+ mii->val_out = BMSR_LSTATUS;
+ }
+ read_unlock(&bond->curr_slave_lock);
+diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c
+index 11b8f1b..bacd25f 100644
+--- a/drivers/net/forcedeth.c
++++ b/drivers/net/forcedeth.c
+@@ -2692,11 +2692,13 @@ static int nv_request_irq(struct net_device *dev, int intr_test)
+ }
+ if (ret != 0 && np->msi_flags & NV_MSI_CAPABLE) {
+ if ((ret = pci_enable_msi(np->pci_dev)) == 0) {
++ pci_intx(np->pci_dev, 0);
+ np->msi_flags |= NV_MSI_ENABLED;
+ if ((!intr_test && request_irq(np->pci_dev->irq, &nv_nic_irq, IRQF_SHARED, dev->name, dev) != 0) ||
+ (intr_test && request_irq(np->pci_dev->irq, &nv_nic_irq_test, IRQF_SHARED, dev->name, dev) != 0)) {
+ printk(KERN_INFO "forcedeth: request_irq failed %d\n", ret);
+ pci_disable_msi(np->pci_dev);
++ pci_intx(np->pci_dev, 1);
+ np->msi_flags &= ~NV_MSI_ENABLED;
+ goto out_err;
+ }
+@@ -2739,6 +2741,7 @@ static void nv_free_irq(struct net_device *dev)
+ free_irq(np->pci_dev->irq, dev);
+ if (np->msi_flags & NV_MSI_ENABLED) {
+ pci_disable_msi(np->pci_dev);
++ pci_intx(np->pci_dev, 1);
+ np->msi_flags &= ~NV_MSI_ENABLED;
+ }
+ }
+diff --git a/drivers/net/sunhme.c b/drivers/net/sunhme.c
+index c6f5bc3..3bbf0c8 100644
+--- a/drivers/net/sunhme.c
++++ b/drivers/net/sunhme.c
+@@ -3012,6 +3012,11 @@ static int __devinit happy_meal_pci_probe(struct pci_dev *pdev,
+ #endif
+
+ err = -ENODEV;
++
++ if (pci_enable_device(pdev))
++ goto err_out;
++ pci_set_master(pdev);
++
+ if (!strcmp(prom_name, "SUNW,qfe") || !strcmp(prom_name, "qfe")) {
+ qp = quattro_pci_find(pdev);
+ if (qp == NULL)
+diff --git a/fs/compat.c b/fs/compat.c
+index e31e9cf..f8c5213 100644
+--- a/fs/compat.c
++++ b/fs/compat.c
+@@ -873,7 +873,7 @@ asmlinkage long compat_sys_mount(char __user * dev_name, char __user * dir_name,
+
+ retval = -EINVAL;
+
+- if (type_page) {
++ if (type_page && data_page) {
+ if (!strcmp((char *)type_page, SMBFS_NAME)) {
+ do_smb_super_data_conv((void *)data_page);
+ } else if (!strcmp((char *)type_page, NCPFS_NAME)) {
+diff --git a/include/asm-arm/unistd.h b/include/asm-arm/unistd.h
+index 1e891f8..188e24b 100644
+--- a/include/asm-arm/unistd.h
++++ b/include/asm-arm/unistd.h
+@@ -347,6 +347,19 @@
+ #define __NR_mbind (__NR_SYSCALL_BASE+319)
+ #define __NR_get_mempolicy (__NR_SYSCALL_BASE+320)
+ #define __NR_set_mempolicy (__NR_SYSCALL_BASE+321)
++#define __NR_openat (__NR_SYSCALL_BASE+322)
++#define __NR_mkdirat (__NR_SYSCALL_BASE+323)
++#define __NR_mknodat (__NR_SYSCALL_BASE+324)
++#define __NR_fchownat (__NR_SYSCALL_BASE+325)
++#define __NR_futimesat (__NR_SYSCALL_BASE+326)
++#define __NR_fstatat64 (__NR_SYSCALL_BASE+327)
++#define __NR_unlinkat (__NR_SYSCALL_BASE+328)
++#define __NR_renameat (__NR_SYSCALL_BASE+329)
++#define __NR_linkat (__NR_SYSCALL_BASE+330)
++#define __NR_symlinkat (__NR_SYSCALL_BASE+331)
++#define __NR_readlinkat (__NR_SYSCALL_BASE+332)
++#define __NR_fchmodat (__NR_SYSCALL_BASE+333)
++#define __NR_faccessat (__NR_SYSCALL_BASE+334)
+
+ /*
+ * The following SWIs are ARM private.
+diff --git a/include/asm-m32r/ptrace.h b/include/asm-m32r/ptrace.h
+index 2d2a6c9..632b4ce 100644
+--- a/include/asm-m32r/ptrace.h
++++ b/include/asm-m32r/ptrace.h
+@@ -33,21 +33,10 @@
+ #define PT_R15 PT_SP
+
+ /* processor status and miscellaneous context registers. */
+-#if defined(CONFIG_ISA_M32R2) && defined(CONFIG_ISA_DSP_LEVEL2)
+ #define PT_ACC0H 15
+ #define PT_ACC0L 16
+-#define PT_ACC1H 17
+-#define PT_ACC1L 18
+-#define PT_ACCH PT_ACC0H
+-#define PT_ACCL PT_ACC0L
+-#elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R)
+-#define PT_ACCH 15
+-#define PT_ACCL 16
+-#define PT_DUMMY_ACC1H 17
+-#define PT_DUMMY_ACC1L 18
+-#else
+-#error unknown isa conifiguration
+-#endif
++#define PT_ACC1H 17 /* ISA_DSP_LEVEL2 only */
++#define PT_ACC1L 18 /* ISA_DSP_LEVEL2 only */
+ #define PT_PSW 19
+ #define PT_BPC 20
+ #define PT_BBPSW 21
+@@ -103,19 +92,10 @@ struct pt_regs {
+ long syscall_nr;
+
+ /* Saved main processor status and miscellaneous context registers. */
+-#if defined(CONFIG_ISA_M32R2) && defined(CONFIG_ISA_DSP_LEVEL2)
+ unsigned long acc0h;
+ unsigned long acc0l;
+- unsigned long acc1h;
+- unsigned long acc1l;
+-#elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R)
+- unsigned long acch;
+- unsigned long accl;
+- unsigned long dummy_acc1h;
+- unsigned long dummy_acc1l;
+-#else
+-#error unknown isa configuration
+-#endif
++ unsigned long acc1h; /* ISA_DSP_LEVEL2 only */
++ unsigned long acc1l; /* ISA_DSP_LEVEL2 only */
+ unsigned long psw;
+ unsigned long bpc; /* saved PC for TRAP syscalls */
+ unsigned long bbpsw;
+diff --git a/include/asm-m32r/sigcontext.h b/include/asm-m32r/sigcontext.h
+index 73025c0..62537dc 100644
+--- a/include/asm-m32r/sigcontext.h
++++ b/include/asm-m32r/sigcontext.h
+@@ -23,19 +23,10 @@ struct sigcontext {
+ unsigned long sc_r12;
+
+ /* Saved main processor status and miscellaneous context registers. */
+-#if defined(CONFIG_ISA_M32R2) && defined(CONFIG_ISA_DSP_LEVEL2)
+ unsigned long sc_acc0h;
+ unsigned long sc_acc0l;
+- unsigned long sc_acc1h;
+- unsigned long sc_acc1l;
+-#elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R)
+- unsigned long sc_acch;
+- unsigned long sc_accl;
+- unsigned long sc_dummy_acc1h;
+- unsigned long sc_dummy_acc1l;
+-#else
+-#error unknown isa configuration
+-#endif
++ unsigned long sc_acc1h; /* ISA_DSP_LEVEL2 only */
++ unsigned long sc_acc1l; /* ISA_DSP_LEVEL2 only */
+ unsigned long sc_psw;
+ unsigned long sc_bpc; /* saved PC for TRAP syscalls */
+ unsigned long sc_bbpsw;
+diff --git a/kernel/softirq.c b/kernel/softirq.c
+index 3789ca9..aee8b98 100644
+--- a/kernel/softirq.c
++++ b/kernel/softirq.c
+@@ -574,8 +574,6 @@ static int __cpuinit cpu_callback(struct notifier_block *nfb,
+
+ switch (action) {
+ case CPU_UP_PREPARE:
+- BUG_ON(per_cpu(tasklet_vec, hotcpu).list);
+- BUG_ON(per_cpu(tasklet_hi_vec, hotcpu).list);
+ p = kthread_create(ksoftirqd, hcpu, "ksoftirqd/%d", hotcpu);
+ if (IS_ERR(p)) {
+ printk("ksoftirqd for %i failed\n", hotcpu);
+diff --git a/net/bluetooth/cmtp/capi.c b/net/bluetooth/cmtp/capi.c
+index be04e9f..ab166b4 100644
+--- a/net/bluetooth/cmtp/capi.c
++++ b/net/bluetooth/cmtp/capi.c
+@@ -196,6 +196,9 @@ static void cmtp_recv_interopmsg(struct cmtp_session *session, struct sk_buff *s
+
+ switch (CAPIMSG_SUBCOMMAND(skb->data)) {
+ case CAPI_CONF:
++ if (skb->len < CAPI_MSG_BASELEN + 10)
++ break;
++
+ func = CAPIMSG_U16(skb->data, CAPI_MSG_BASELEN + 5);
+ info = CAPIMSG_U16(skb->data, CAPI_MSG_BASELEN + 8);
+
+@@ -226,6 +229,9 @@ static void cmtp_recv_interopmsg(struct cmtp_session *session, struct sk_buff *s
+ break;
+
+ case CAPI_FUNCTION_GET_PROFILE:
++ if (skb->len < CAPI_MSG_BASELEN + 11 + sizeof(capi_profile))
++ break;
++
+ controller = CAPIMSG_U16(skb->data, CAPI_MSG_BASELEN + 11);
+ msgnum = CAPIMSG_MSGID(skb->data);
+
+@@ -246,17 +252,26 @@ static void cmtp_recv_interopmsg(struct cmtp_session *session, struct sk_buff *s
+ break;
+
+ case CAPI_FUNCTION_GET_MANUFACTURER:
++ if (skb->len < CAPI_MSG_BASELEN + 15)
++ break;
++
+ controller = CAPIMSG_U32(skb->data, CAPI_MSG_BASELEN + 10);
+
+ if (!info && ctrl) {
++ int len = min_t(uint, CAPI_MANUFACTURER_LEN,
++ skb->data[CAPI_MSG_BASELEN + 14]);
++
++ memset(ctrl->manu, 0, CAPI_MANUFACTURER_LEN);
+ strncpy(ctrl->manu,
+- skb->data + CAPI_MSG_BASELEN + 15,
+- skb->data[CAPI_MSG_BASELEN + 14]);
++ skb->data + CAPI_MSG_BASELEN + 15, len);
+ }
+
+ break;
+
+ case CAPI_FUNCTION_GET_VERSION:
++ if (skb->len < CAPI_MSG_BASELEN + 32)
++ break;
++
+ controller = CAPIMSG_U32(skb->data, CAPI_MSG_BASELEN + 12);
+
+ if (!info && ctrl) {
+@@ -269,13 +284,18 @@ static void cmtp_recv_interopmsg(struct cmtp_session *session, struct sk_buff *s
+ break;
+
+ case CAPI_FUNCTION_GET_SERIAL_NUMBER:
++ if (skb->len < CAPI_MSG_BASELEN + 17)
++ break;
++
+ controller = CAPIMSG_U32(skb->data, CAPI_MSG_BASELEN + 12);
+
+ if (!info && ctrl) {
++ int len = min_t(uint, CAPI_SERIAL_LEN,
++ skb->data[CAPI_MSG_BASELEN + 16]);
++
+ memset(ctrl->serial, 0, CAPI_SERIAL_LEN);
+ strncpy(ctrl->serial,
+- skb->data + CAPI_MSG_BASELEN + 17,
+- skb->data[CAPI_MSG_BASELEN + 16]);
++ skb->data + CAPI_MSG_BASELEN + 17, len);
+ }
+
+ break;
+@@ -284,14 +304,18 @@ static void cmtp_recv_interopmsg(struct cmtp_session *session, struct sk_buff *s
+ break;
+
+ case CAPI_IND:
++ if (skb->len < CAPI_MSG_BASELEN + 6)
++ break;
++
+ func = CAPIMSG_U16(skb->data, CAPI_MSG_BASELEN + 3);
+
+ if (func == CAPI_FUNCTION_LOOPBACK) {
++ int len = min_t(uint, skb->len - CAPI_MSG_BASELEN - 6,
++ skb->data[CAPI_MSG_BASELEN + 5]);
+ appl = CAPIMSG_APPID(skb->data);
+ msgnum = CAPIMSG_MSGID(skb->data);
+ cmtp_send_interopmsg(session, CAPI_RESP, appl, msgnum, func,
+- skb->data + CAPI_MSG_BASELEN + 6,
+- skb->data[CAPI_MSG_BASELEN + 5]);
++ skb->data + CAPI_MSG_BASELEN + 6, len);
+ }
+
+ break;
+@@ -309,6 +333,9 @@ void cmtp_recv_capimsg(struct cmtp_session *session, struct sk_buff *skb)
+
+ BT_DBG("session %p skb %p len %d", session, skb, skb->len);
+
++ if (skb->len < CAPI_MSG_BASELEN)
++ return;
++
+ if (CAPIMSG_COMMAND(skb->data) == CAPI_INTEROPERABILITY) {
+ cmtp_recv_interopmsg(session, skb);
+ return;
+diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c
+index 3a13ed6..1969658 100644
+--- a/net/bridge/netfilter/ebtables.c
++++ b/net/bridge/netfilter/ebtables.c
+@@ -360,10 +360,11 @@ ebt_check_match(struct ebt_entry_match *m, struct ebt_entry *e,
+ const char *name, unsigned int hookmask, unsigned int *cnt)
+ {
+ struct ebt_match *match;
++ size_t left = ((char *)e + e->watchers_offset) - (char *)m;
+ int ret;
+
+- if (((char *)m) + m->match_size + sizeof(struct ebt_entry_match) >
+- ((char *)e) + e->watchers_offset)
++ if (left < sizeof(struct ebt_entry_match) ||
++ left - sizeof(struct ebt_entry_match) < m->match_size)
+ return -EINVAL;
+ match = find_match_lock(m->u.name, &ret, &ebt_mutex);
+ if (!match)
+@@ -389,10 +390,11 @@ ebt_check_watcher(struct ebt_entry_watcher *w, struct ebt_entry *e,
+ const char *name, unsigned int hookmask, unsigned int *cnt)
+ {
+ struct ebt_watcher *watcher;
++ size_t left = ((char *)e + e->target_offset) - (char *)w;
+ int ret;
+
+- if (((char *)w) + w->watcher_size + sizeof(struct ebt_entry_watcher) >
+- ((char *)e) + e->target_offset)
++ if (left < sizeof(struct ebt_entry_watcher) ||
++ left - sizeof(struct ebt_entry_watcher) < w->watcher_size)
+ return -EINVAL;
+ watcher = find_watcher_lock(w->u.name, &ret, &ebt_mutex);
+ if (!watcher)
+@@ -423,19 +425,23 @@ ebt_check_entry_size_and_hooks(struct ebt_entry *e,
+ struct ebt_entries **hook_entries, unsigned int *n, unsigned int *cnt,
+ unsigned int *totalcnt, unsigned int *udc_cnt, unsigned int valid_hooks)
+ {
++ unsigned int offset = (char *)e - newinfo->entries;
++ size_t left = (limit - base) - offset;
+ int i;
+
++ if (left < sizeof(unsigned int))
++ goto Esmall;
++
+ for (i = 0; i < NF_BR_NUMHOOKS; i++) {
+ if ((valid_hooks & (1 << i)) == 0)
+ continue;
+- if ( (char *)hook_entries[i] - base ==
+- (char *)e - newinfo->entries)
++ if ((char *)hook_entries[i] == base + offset)
+ break;
+ }
+ /* beginning of a new chain
+ if i == NF_BR_NUMHOOKS it must be a user defined chain */
+ if (i != NF_BR_NUMHOOKS || !(e->bitmask & EBT_ENTRY_OR_ENTRIES)) {
+- if ((e->bitmask & EBT_ENTRY_OR_ENTRIES) != 0) {
++ if (e->bitmask != 0) {
+ /* we make userspace set this right,
+ so there is no misunderstanding */
+ BUGPRINT("EBT_ENTRY_OR_ENTRIES shouldn't be set "
+@@ -450,11 +456,8 @@ ebt_check_entry_size_and_hooks(struct ebt_entry *e,
+ return -EINVAL;
+ }
+ /* before we look at the struct, be sure it is not too big */
+- if ((char *)hook_entries[i] + sizeof(struct ebt_entries)
+- > limit) {
+- BUGPRINT("entries_size too small\n");
+- return -EINVAL;
+- }
++ if (left < sizeof(struct ebt_entries))
++ goto Esmall;
+ if (((struct ebt_entries *)e)->policy != EBT_DROP &&
+ ((struct ebt_entries *)e)->policy != EBT_ACCEPT) {
+ /* only RETURN from udc */
+@@ -477,6 +480,8 @@ ebt_check_entry_size_and_hooks(struct ebt_entry *e,
+ return 0;
+ }
+ /* a plain old entry, heh */
++ if (left < sizeof(struct ebt_entry))
++ goto Esmall;
+ if (sizeof(struct ebt_entry) > e->watchers_offset ||
+ e->watchers_offset > e->target_offset ||
+ e->target_offset >= e->next_offset) {
+@@ -488,10 +493,16 @@ ebt_check_entry_size_and_hooks(struct ebt_entry *e,
+ BUGPRINT("target size too small\n");
+ return -EINVAL;
+ }
++ if (left < e->next_offset)
++ goto Esmall;
+
+ (*cnt)++;
+ (*totalcnt)++;
+ return 0;
++
++Esmall:
++ BUGPRINT("entries_size too small\n");
++ return -EINVAL;
+ }
+
+ struct ebt_cl_stack
+@@ -513,7 +524,7 @@ ebt_get_udc_positions(struct ebt_entry *e, struct ebt_table_info *newinfo,
+ int i;
+
+ /* we're only interested in chain starts */
+- if (e->bitmask & EBT_ENTRY_OR_ENTRIES)
++ if (e->bitmask)
+ return 0;
+ for (i = 0; i < NF_BR_NUMHOOKS; i++) {
+ if ((valid_hooks & (1 << i)) == 0)
+@@ -563,7 +574,7 @@ ebt_cleanup_entry(struct ebt_entry *e, unsigned int *cnt)
+ {
+ struct ebt_entry_target *t;
+
+- if ((e->bitmask & EBT_ENTRY_OR_ENTRIES) == 0)
++ if (e->bitmask == 0)
+ return 0;
+ /* we're done */
+ if (cnt && (*cnt)-- == 0)
+@@ -586,10 +597,11 @@ ebt_check_entry(struct ebt_entry *e, struct ebt_table_info *newinfo,
+ struct ebt_entry_target *t;
+ struct ebt_target *target;
+ unsigned int i, j, hook = 0, hookmask = 0;
++ size_t gap = e->next_offset - e->target_offset;
+ int ret;
+
+ /* don't mess with the struct ebt_entries */
+- if ((e->bitmask & EBT_ENTRY_OR_ENTRIES) == 0)
++ if (e->bitmask == 0)
+ return 0;
+
+ if (e->bitmask & ~EBT_F_MASK) {
+@@ -647,8 +659,7 @@ ebt_check_entry(struct ebt_entry *e, struct ebt_table_info *newinfo,
+
+ t->u.target = target;
+ if (t->u.target == &ebt_standard_target) {
+- if (e->target_offset + sizeof(struct ebt_standard_target) >
+- e->next_offset) {
++ if (gap < sizeof(struct ebt_standard_target)) {
+ BUGPRINT("Standard target size too big\n");
+ ret = -EFAULT;
+ goto cleanup_watchers;
+@@ -659,8 +670,7 @@ ebt_check_entry(struct ebt_entry *e, struct ebt_table_info *newinfo,
+ ret = -EFAULT;
+ goto cleanup_watchers;
+ }
+- } else if ((e->target_offset + t->target_size +
+- sizeof(struct ebt_entry_target) > e->next_offset) ||
++ } else if (t->target_size > gap - sizeof(struct ebt_entry_target) ||
+ (t->u.target->check &&
+ t->u.target->check(name, hookmask, e, t->data, t->target_size) != 0)){
+ module_put(t->u.target->me);
+@@ -730,7 +740,9 @@ static int check_chainloops(struct ebt_entries *chain, struct ebt_cl_stack *cl_s
+ BUGPRINT("loop\n");
+ return -1;
+ }
+- /* this can't be 0, so the above test is correct */
++ if (cl_s[i].hookmask & (1 << hooknr))
++ goto letscontinue;
++ /* this can't be 0, so the loop test is correct */
+ cl_s[i].cs.n = pos + 1;
+ pos = 0;
+ cl_s[i].cs.e = ((void *)e + e->next_offset);
+@@ -1307,7 +1319,7 @@ static inline int ebt_make_names(struct ebt_entry *e, char *base, char *ubase)
+ char *hlp;
+ struct ebt_entry_target *t;
+
+- if ((e->bitmask & EBT_ENTRY_OR_ENTRIES) == 0)
++ if (e->bitmask == 0)
+ return 0;
+
+ hlp = ubase - base + (char *)e + e->target_offset;
+diff --git a/net/ieee80211/softmac/ieee80211softmac_scan.c b/net/ieee80211/softmac/ieee80211softmac_scan.c
+index d31cf77..ad67368 100644
+--- a/net/ieee80211/softmac/ieee80211softmac_scan.c
++++ b/net/ieee80211/softmac/ieee80211softmac_scan.c
+@@ -47,7 +47,6 @@ ieee80211softmac_start_scan(struct ieee80211softmac_device *sm)
+ sm->scanning = 1;
+ spin_unlock_irqrestore(&sm->lock, flags);
+
+- netif_tx_disable(sm->ieee->dev);
+ ret = sm->start_scan(sm->dev);
+ if (ret) {
+ spin_lock_irqsave(&sm->lock, flags);
+@@ -248,7 +247,6 @@ void ieee80211softmac_scan_finished(struct ieee80211softmac_device *sm)
+ if (net)
+ sm->set_channel(sm->dev, net->channel);
+ }
+- netif_wake_queue(sm->ieee->dev);
+ ieee80211softmac_call_events(sm, IEEE80211SOFTMAC_EVENT_SCAN_FINISHED, NULL);
+ }
+ EXPORT_SYMBOL_GPL(ieee80211softmac_scan_finished);
+diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c
+index e964436..a560c55 100644
+--- a/net/ipv4/netfilter/ip_tables.c
++++ b/net/ipv4/netfilter/ip_tables.c
+@@ -1989,6 +1989,8 @@ compat_get_entries(struct compat_ipt_get_entries __user *uptr, int *len)
+ return ret;
+ }
+
++static int do_ipt_get_ctl(struct sock *, int, void __user *, int *);
++
+ static int
+ compat_do_ipt_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)
+ {
+@@ -2005,8 +2007,7 @@ compat_do_ipt_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)
+ ret = compat_get_entries(user, len);
+ break;
+ default:
+- duprintf("compat_do_ipt_get_ctl: unknown request %i\n", cmd);
+- ret = -EINVAL;
++ ret = do_ipt_get_ctl(sk, cmd, user, len);
+ }
+ return ret;
+ }
+diff --git a/net/ipv4/route.c b/net/ipv4/route.c
+index b873cbc..c7a806b 100644
+--- a/net/ipv4/route.c
++++ b/net/ipv4/route.c
+@@ -1775,7 +1775,7 @@ static inline int __mkroute_input(struct sk_buff *skb,
+ #endif
+ if (in_dev->cnf.no_policy)
+ rth->u.dst.flags |= DST_NOPOLICY;
+- if (in_dev->cnf.no_xfrm)
++ if (out_dev->cnf.no_xfrm)
+ rth->u.dst.flags |= DST_NOXFRM;
+ rth->fl.fl4_dst = daddr;
+ rth->rt_dst = daddr;
+diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c
+index 8f50eae..eae687d 100644
+--- a/net/ipv4/xfrm4_policy.c
++++ b/net/ipv4/xfrm4_policy.c
+@@ -252,6 +252,8 @@ static void xfrm4_dst_destroy(struct dst_entry *dst)
+
+ if (likely(xdst->u.rt.idev))
+ in_dev_put(xdst->u.rt.idev);
++ if (likely(xdst->u.rt.peer))
++ inet_putpeer(xdst->u.rt.peer);
+ xfrm_dst_destroy(xdst);
+ }
+
+diff --git a/net/irda/irttp.c b/net/irda/irttp.c
+index 42acf1c..be0d8fa 100644
+--- a/net/irda/irttp.c
++++ b/net/irda/irttp.c
+@@ -1098,7 +1098,7 @@ int irttp_connect_request(struct tsap_cb *self, __u8 dtsap_sel,
+ return -ENOMEM;
+
+ /* Reserve space for MUX_CONTROL and LAP header */
+- skb_reserve(tx_skb, TTP_MAX_HEADER);
++ skb_reserve(tx_skb, TTP_MAX_HEADER + TTP_SAR_HEADER);
+ } else {
+ tx_skb = userdata;
+ /*
+@@ -1346,7 +1346,7 @@ int irttp_connect_response(struct tsap_cb *self, __u32 max_sdu_size,
+ return -ENOMEM;
+
+ /* Reserve space for MUX_CONTROL and LAP header */
+- skb_reserve(tx_skb, TTP_MAX_HEADER);
++ skb_reserve(tx_skb, TTP_MAX_HEADER + TTP_SAR_HEADER);
+ } else {
+ tx_skb = userdata;
+ /*
+diff --git a/net/sched/act_gact.c b/net/sched/act_gact.c
+index e75a147..a29d0f6 100644
+--- a/net/sched/act_gact.c
++++ b/net/sched/act_gact.c
+@@ -54,14 +54,14 @@ static DEFINE_RWLOCK(gact_lock);
+ #ifdef CONFIG_GACT_PROB
+ static int gact_net_rand(struct tcf_gact *p)
+ {
+- if (net_random()%p->pval)
++ if (!p->pval || net_random()%p->pval)
+ return p->action;
+ return p->paction;
+ }
+
+ static int gact_determ(struct tcf_gact *p)
+ {
+- if (p->bstats.packets%p->pval)
++ if (!p->pval || p->bstats.packets%p->pval)
+ return p->action;
+ return p->paction;
+ }
+diff --git a/net/sched/act_police.c b/net/sched/act_police.c
+index da905d7..930e010 100644
+--- a/net/sched/act_police.c
++++ b/net/sched/act_police.c
+@@ -44,6 +44,18 @@ static struct tcf_police *tcf_police_ht[MY_TAB_SIZE];
+ /* Policer hash table lock */
+ static DEFINE_RWLOCK(police_lock);
+
++/* old policer structure from before tc actions */
++struct tc_police_compat
++{
++ u32 index;
++ int action;
++ u32 limit;
++ u32 burst;
++ u32 mtu;
++ struct tc_ratespec rate;
++ struct tc_ratespec peakrate;
++};
++
+ /* Each policer is serialized by its individual spinlock */
+
+ static __inline__ unsigned tcf_police_hash(u32 index)
+@@ -169,12 +181,15 @@ static int tcf_act_police_locate(struct rtattr *rta, struct rtattr *est,
+ struct tc_police *parm;
+ struct tcf_police *p;
+ struct qdisc_rate_table *R_tab = NULL, *P_tab = NULL;
++ int size;
+
+ if (rta == NULL || rtattr_parse_nested(tb, TCA_POLICE_MAX, rta) < 0)
+ return -EINVAL;
+
+- if (tb[TCA_POLICE_TBF-1] == NULL ||
+- RTA_PAYLOAD(tb[TCA_POLICE_TBF-1]) != sizeof(*parm))
++ if (tb[TCA_POLICE_TBF-1] == NULL)
++ return -EINVAL;
++ size = RTA_PAYLOAD(tb[TCA_POLICE_TBF-1]);
++ if (size != sizeof(*parm) && size != sizeof(struct tc_police_compat))
+ return -EINVAL;
+ parm = RTA_DATA(tb[TCA_POLICE_TBF-1]);
+
+@@ -413,12 +428,15 @@ struct tcf_police * tcf_police_locate(struct rtattr *rta, struct rtattr *est)
+ struct tcf_police *p;
+ struct rtattr *tb[TCA_POLICE_MAX];
+ struct tc_police *parm;
++ int size;
+
+ if (rtattr_parse_nested(tb, TCA_POLICE_MAX, rta) < 0)
+ return NULL;
+
+- if (tb[TCA_POLICE_TBF-1] == NULL ||
+- RTA_PAYLOAD(tb[TCA_POLICE_TBF-1]) != sizeof(*parm))
++ if (tb[TCA_POLICE_TBF-1] == NULL)
++ return NULL;
++ size = RTA_PAYLOAD(tb[TCA_POLICE_TBF-1]);
++ if (size != sizeof(*parm) && size != sizeof(struct tc_police_compat))
+ return NULL;
+
+ parm = RTA_DATA(tb[TCA_POLICE_TBF-1]);
Modified: dists/sid/linux-2.6/debian/patches/series/9
==============================================================================
--- dists/sid/linux-2.6/debian/patches/series/9 (original)
+++ dists/sid/linux-2.6/debian/patches/series/9 Sat Dec 30 10:10:42 2006
@@ -1,4 +1,3 @@
-+ bugfix/dm-crypt-fix-data-corruption-with-dm-crypt-over-raid5.patch
- bugfix/2.6.18.5-revert-abi-1.patch
+ bugfix/ip6_tables-protocol-bypass-bug.patch
+ bugfix/ip6_tables-extension-header-bypass-bug.patch
@@ -16,13 +15,14 @@
+ bugfix/mincore-hang.patch
+ bugfix/mincore-error-value-cases.patch
+ bugfix/mincore-typo.patch
+- bugfix/sunhme-pci-enable.patch
++ bugfix/2.6.18.6
+ bugfix/2.6.16.30
+ bugfix/2.6.16.31
+ bugfix/2.6.16.32
+ bugfix/2.6.16.33
+ bugfix/2.6.16.34
+ bugfix/2.6.16.35
-+ bugfix/2.6.16.36
+ bugfix/2.6.16.37
+ bugfix/sparc/isa-dev-no-reg.patch
+ bugfix/sparc/ehci-hub-contol-alignment.patch
More information about the Kernel-svn-changes
mailing list