From e33a9f415437400a792470d07d3da4b2ac374af5 Mon Sep 17 00:00:00 2001
From: Tim Yamin <plasmaroo@gentoo.org>
Date: Fri, 25 Jun 2004 20:15:29 +0000
Subject: Security bumps for the CAN-2004-0495 and CAN-2004-0535
 vulnerabilities.

---
 sys-kernel/uclinux-sources/ChangeLog               |  11 +-
 sys-kernel/uclinux-sources/Manifest                |  15 +-
 .../files/digest-uclinux-sources-2.4.26_p0-r1      |   2 -
 .../files/digest-uclinux-sources-2.4.26_p0-r2      |   2 +
 .../files/digest-uclinux-sources-2.6.6_p0-r1       |   2 -
 .../files/digest-uclinux-sources-2.6.7_p0          |   2 +
 .../uclinux-sources-2.4.26_p0.CAN-2004-0495.patch  | 655 +++++++++++++++++++++
 .../uclinux-sources-2.4.26_p0.CAN-2004-0535.patch  |  12 +
 .../uclinux-sources-2.6.6_p0.FPULockup-53804.patch |  24 -
 .../uclinux-sources-2.4.26_p0-r1.ebuild            |  52 --
 .../uclinux-sources-2.4.26_p0-r2.ebuild            |  54 ++
 .../uclinux-sources-2.6.6_p0-r1.ebuild             |  51 --
 .../uclinux-sources-2.6.7_p0.ebuild                |  49 ++
 13 files changed, 792 insertions(+), 139 deletions(-)
 delete mode 100644 sys-kernel/uclinux-sources/files/digest-uclinux-sources-2.4.26_p0-r1
 create mode 100644 sys-kernel/uclinux-sources/files/digest-uclinux-sources-2.4.26_p0-r2
 delete mode 100644 sys-kernel/uclinux-sources/files/digest-uclinux-sources-2.6.6_p0-r1
 create mode 100644 sys-kernel/uclinux-sources/files/digest-uclinux-sources-2.6.7_p0
 create mode 100644 sys-kernel/uclinux-sources/files/uclinux-sources-2.4.26_p0.CAN-2004-0495.patch
 create mode 100644 sys-kernel/uclinux-sources/files/uclinux-sources-2.4.26_p0.CAN-2004-0535.patch
 delete mode 100644 sys-kernel/uclinux-sources/files/uclinux-sources-2.6.6_p0.FPULockup-53804.patch
 delete mode 100644 sys-kernel/uclinux-sources/uclinux-sources-2.4.26_p0-r1.ebuild
 create mode 100644 sys-kernel/uclinux-sources/uclinux-sources-2.4.26_p0-r2.ebuild
 delete mode 100644 sys-kernel/uclinux-sources/uclinux-sources-2.6.6_p0-r1.ebuild
 create mode 100644 sys-kernel/uclinux-sources/uclinux-sources-2.6.7_p0.ebuild

(limited to 'sys-kernel/uclinux-sources')

diff --git a/sys-kernel/uclinux-sources/ChangeLog b/sys-kernel/uclinux-sources/ChangeLog
index c9b065d94a97..3bea5b10a312 100644
--- a/sys-kernel/uclinux-sources/ChangeLog
+++ b/sys-kernel/uclinux-sources/ChangeLog
@@ -1,6 +1,15 @@
 # ChangeLog for sys-kernel/uclinux-sources
 # Copyright 2000-2004 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/sys-kernel/uclinux-sources/ChangeLog,v 1.10 2004/06/24 23:01:30 agriffis Exp $
+# $Header: /var/cvsroot/gentoo-x86/sys-kernel/uclinux-sources/ChangeLog,v 1.11 2004/06/25 20:15:29 plasmaroo Exp $
+
+*uclinux-sources-2.4.26_p0-r2 (25 Jun 2004)
+
+  25 Jun 2004; <plasmaroo@gentoo.org> -uclinux-sources-2.4.26_p0-r1.ebuild,
+  +uclinux-sources-2.4.26_p0-r2.ebuild, -uclinux-sources-2.6.6_p0-r1.ebuild,
+  +uclinux-sources-2.6.7_p0.ebuild,
+  +files/uclinux-sources-2.4.26_p0.CAN-2004-0495.patch,
+  +files/uclinux-sources-2.4.26_p0.CAN-2004-0535.patch:
+  Security bumps for the CAN-2004-0495 and CAN-2004-0535 vulnerabilities.
 
 *uclinux-sources-2.4.26_p0-r1 (15 Jun 2004)
 
diff --git a/sys-kernel/uclinux-sources/Manifest b/sys-kernel/uclinux-sources/Manifest
index 388474f585dc..b61e89447825 100644
--- a/sys-kernel/uclinux-sources/Manifest
+++ b/sys-kernel/uclinux-sources/Manifest
@@ -1,9 +1,10 @@
-MD5 8aa5d65e649b0c4ba1ca89c909edc51c uclinux-sources-2.6.6_p0-r1.ebuild 1348
-MD5 474b16f9ec7f46b59929f7425f0d1097 uclinux-sources-2.4.26_p0-r1.ebuild 1444
-MD5 07aba7bbbd776da1af6c25a0dab35588 ChangeLog 2751
+MD5 4062f585a155b889d68ae27e6f36f63f ChangeLog 3173
+MD5 f1f5d10e24c58195fa7baf63cae16a54 uclinux-sources-2.6.7_p0.ebuild 1255
 MD5 f3fa6c474b8727f8215534b7fc9c93ba metadata.xml 304
-MD5 888a07115033bc74061391d7c4ccfaaf files/digest-uclinux-sources-2.6.6_p0-r1 135
-MD5 c9da1bc82b906f6abc648c056e7bf662 files/uclinux-sources-2.4.26_p0.FPULockup-53804.patch 354
+MD5 761e2bd0885471c59fbe56d25276b798 uclinux-sources-2.4.26_p0-r2.ebuild 1631
+MD5 dc18e982f8149588a291956481885a8c files/uclinux-sources-2.4.26_p0.CAN-2004-0495.patch 17549
 MD5 d4a740ae56c2049247083af387a22a85 files/uclinux-sources-2.4.26_p0.CAN-2004-0394.patch 350
-MD5 62306f42a51f255b1d9cd1597cefa926 files/digest-uclinux-sources-2.4.26_p0-r1 139
-MD5 02c062ec3a11a6a1498cdf0b1716c90a files/uclinux-sources-2.6.6_p0.FPULockup-53804.patch 895
+MD5 0f66013f643c79c97fda489618a4e2fd files/uclinux-sources-2.4.26_p0.CAN-2004-0535.patch 476
+MD5 62306f42a51f255b1d9cd1597cefa926 files/digest-uclinux-sources-2.4.26_p0-r2 139
+MD5 c9da1bc82b906f6abc648c056e7bf662 files/uclinux-sources-2.4.26_p0.FPULockup-53804.patch 354
+MD5 51b7d703355037eac400cf789769f9c7 files/digest-uclinux-sources-2.6.7_p0 135
diff --git a/sys-kernel/uclinux-sources/files/digest-uclinux-sources-2.4.26_p0-r1 b/sys-kernel/uclinux-sources/files/digest-uclinux-sources-2.4.26_p0-r1
deleted file mode 100644
index 130b229c980e..000000000000
--- a/sys-kernel/uclinux-sources/files/digest-uclinux-sources-2.4.26_p0-r1
+++ /dev/null
@@ -1,2 +0,0 @@
-MD5 88d7aefa03c92739cb70298a0b486e2c linux-2.4.26.tar.bz2 30772389
-MD5 8c2a75543abe268ff71d59c85b7607ac uClinux-2.4.26-uc0.diff.gz 4062854
diff --git a/sys-kernel/uclinux-sources/files/digest-uclinux-sources-2.4.26_p0-r2 b/sys-kernel/uclinux-sources/files/digest-uclinux-sources-2.4.26_p0-r2
new file mode 100644
index 000000000000..130b229c980e
--- /dev/null
+++ b/sys-kernel/uclinux-sources/files/digest-uclinux-sources-2.4.26_p0-r2
@@ -0,0 +1,2 @@
+MD5 88d7aefa03c92739cb70298a0b486e2c linux-2.4.26.tar.bz2 30772389
+MD5 8c2a75543abe268ff71d59c85b7607ac uClinux-2.4.26-uc0.diff.gz 4062854
diff --git a/sys-kernel/uclinux-sources/files/digest-uclinux-sources-2.6.6_p0-r1 b/sys-kernel/uclinux-sources/files/digest-uclinux-sources-2.6.6_p0-r1
deleted file mode 100644
index 19f5d1d1ba26..000000000000
--- a/sys-kernel/uclinux-sources/files/digest-uclinux-sources-2.6.6_p0-r1
+++ /dev/null
@@ -1,2 +0,0 @@
-MD5 5218790bc3db41e77a7422969639a9ad linux-2.6.6.tar.bz2 34896138
-MD5 9eaa834dd12facf92f3ff4393c31e752 linux-2.6.6-uc0.patch.gz 189743
diff --git a/sys-kernel/uclinux-sources/files/digest-uclinux-sources-2.6.7_p0 b/sys-kernel/uclinux-sources/files/digest-uclinux-sources-2.6.7_p0
new file mode 100644
index 000000000000..a0d14dcb41a9
--- /dev/null
+++ b/sys-kernel/uclinux-sources/files/digest-uclinux-sources-2.6.7_p0
@@ -0,0 +1,2 @@
+MD5 a74671ea68b0e3c609e8785ed8497c14 linux-2.6.7.tar.bz2 35092228
+MD5 9f8265eee2179199a81e0a00268eb1a6 linux-2.6.7-uc0.patch.gz 184811
diff --git a/sys-kernel/uclinux-sources/files/uclinux-sources-2.4.26_p0.CAN-2004-0495.patch b/sys-kernel/uclinux-sources/files/uclinux-sources-2.4.26_p0.CAN-2004-0495.patch
new file mode 100644
index 000000000000..bea80eac69a9
--- /dev/null
+++ b/sys-kernel/uclinux-sources/files/uclinux-sources-2.4.26_p0.CAN-2004-0495.patch
@@ -0,0 +1,655 @@
+--- linux/net/decnet/dn_dev.c.bak	Wed Jun 16 14:42:24 2004
++++ linux/net/decnet/dn_dev.c	Wed Jun 16 14:42:34 2004
+@@ -1070,31 +1070,39 @@ int dnet_gifconf(struct net_device *dev,
+ {
+ 	struct dn_dev *dn_db = (struct dn_dev *)dev->dn_ptr;
+ 	struct dn_ifaddr *ifa;
+-	struct ifreq *ifr = (struct ifreq *)buf;
++	char buffer[DN_IFREQ_SIZE];
++	struct ifreq *ifr = (struct ifreq *)buffer;
++	struct sockaddr_dn *addr = (struct sockaddr_dn *)&ifr->ifr_addr;
+ 	int done = 0;
+ 
+ 	if ((dn_db == NULL) || ((ifa = dn_db->ifa_list) == NULL))
+ 		return 0;
+ 
+ 	for(; ifa; ifa = ifa->ifa_next) {
+-		if (!ifr) {
++		if (!buf) {
+ 			done += sizeof(DN_IFREQ_SIZE);
+ 			continue;
+ 		}
+ 		if (len < DN_IFREQ_SIZE)
+ 			return done;
+-		memset(ifr, 0, DN_IFREQ_SIZE);
++		memset(buffer, 0, DN_IFREQ_SIZE);
+ 
+ 		if (ifa->ifa_label)
+ 			strcpy(ifr->ifr_name, ifa->ifa_label);
+ 		else
+ 			strcpy(ifr->ifr_name, dev->name);
+ 
+-		(*(struct sockaddr_dn *) &ifr->ifr_addr).sdn_family = AF_DECnet;
+-		(*(struct sockaddr_dn *) &ifr->ifr_addr).sdn_add.a_len = 2;
+-		(*(dn_address *)(*(struct sockaddr_dn *) &ifr->ifr_addr).sdn_add.a_addr) = ifa->ifa_local;
++		addr->sdn_family = AF_DECnet;
++		addr->sdn_add.a_len = 2;
++		memcpy(addr->sdn_add.a_addr, &ifa->ifa_local,
++			sizeof(dn_address));
+ 
+-		ifr = (struct ifreq *)((char *)ifr + DN_IFREQ_SIZE);
++		if (copy_to_user(buf, buffer, DN_IFREQ_SIZE)) {
++			done = -EFAULT;
++			break;
++		}
++
++		buf  += DN_IFREQ_SIZE;
+ 		len  -= DN_IFREQ_SIZE;
+ 		done += DN_IFREQ_SIZE;
+ 	}
+--- linux-2.4.21/drivers/net/wireless/airo.c	2003-06-13 15:51:35.000000000 +0100
++++ linux-2.4.21/drivers/net/wireless/airo.c.plasmaroo	2004-06-24 11:09:08.260352168 +0100
+@@ -3012,19 +3012,22 @@
+ 			  size_t len,
+ 			  loff_t *offset )
+ {
+-	int i;
+-	int pos;
++	loff_t pos = *offset;
+ 	struct proc_data *priv = (struct proc_data*)file->private_data;
+ 
+-	if( !priv->rbuffer ) return -EINVAL;
++	if (!priv->rbuffer)
++		return -EINVAL;
+ 
+-	pos = *offset;
+-	for( i = 0; i+pos < priv->readlen && i < len; i++ ) {
+-		if (put_user( priv->rbuffer[i+pos], buffer+i ))
+-			return -EFAULT;
+-	}
+-	*offset += i;
+-	return i;
++	if (pos < 0)
++		return -EINVAL;
++	if (pos >= priv->readlen)
++		return 0;
++	if (len > priv->readlen - pos)
++		len = priv->readlen - pos;
++	if (copy_to_user(buffer, priv->rbuffer + pos, len))
++		return -EFAULT;
++	*offset = pos + len;
++	return len;
+ }
+ 
+ /*
+@@ -3036,24 +3039,24 @@
+ 			   size_t len,
+ 			   loff_t *offset )
+ {
+-	int i;
+-	int pos;
++	loff_t pos = *offset;
+ 	struct proc_data *priv = (struct proc_data*)file->private_data;
+ 
+-	if ( !priv->wbuffer ) {
++	if (!priv->wbuffer)
+ 		return -EINVAL;
+-	}
+-
+-	pos = *offset;
+ 
+-	for( i = 0; i + pos <  priv->maxwritelen &&
+-		     i < len; i++ ) {
+-		if (get_user( priv->wbuffer[i+pos], buffer + i ))
+-			return -EFAULT;
+-	}
+-	if ( i+pos > priv->writelen ) priv->writelen = i+file->f_pos;
+-	*offset += i;
+-	return i;
++	if (pos < 0)
++		return -EINVAL;
++	if (pos >= priv->maxwritelen)
++		return 0;
++	if (len > priv->maxwritelen - pos)
++		len = priv->maxwritelen - pos;
++	if (copy_from_user(priv->wbuffer + pos, buffer, len))
++		return -EFAULT;
++	if (pos + len > priv->writelen)
++		priv->writelen = pos + len;
++	*offset = pos + len;
++	return len;
+ }
+ 
+ static int proc_status_open( struct inode *inode, struct file *file ) {
+--- linux/drivers/sound/mpu401.c.bak	Wed Jun 16 14:42:24 2004
++++ linux/drivers/sound/mpu401.c	Wed Jun 16 14:42:34 2004
+@@ -1493,14 +1493,16 @@ static unsigned long mpu_timer_get_time(
+ static int mpu_timer_ioctl(int dev, unsigned int command, caddr_t arg)
+ {
+ 	int midi_dev = sound_timer_devs[dev]->devlink;
++	int *p = (int *)arg;
+ 
+ 	switch (command)
+ 	{
+ 		case SNDCTL_TMR_SOURCE:
+ 			{
+ 				int parm;
+-	
+-				parm = *(int *) arg;
++
++				if (get_user(parm, p))
++					return -EFAULT;
+ 				parm &= timer_caps;
+ 
+ 				if (parm != 0)
+@@ -1512,7 +1514,9 @@ static int mpu_timer_ioctl(int dev, unsi
+ 					else if (timer_mode & TMR_MODE_SMPTE)
+ 						mpu_cmd(midi_dev, 0x3d, 0);		/* Use SMPTE sync */
+ 				}
+-				return (*(int *) arg = timer_mode);
++				if (put_user(timer_mode, p))
++					return -EFAULT;
++				return timer_mode;
+ 			}
+ 			break;
+ 
+@@ -1537,10 +1541,13 @@ static int mpu_timer_ioctl(int dev, unsi
+ 			{
+ 				int val;
+ 
+-				val = *(int *) arg;
++				if (get_user(val, p))
++					return -EFAULT;
+ 				if (val)
+ 					set_timebase(midi_dev, val);
+-				return (*(int *) arg = curr_timebase);
++				if (put_user(curr_timebase, p))
++					return -EFAULT;
++				return curr_timebase;
+ 			}
+ 			break;
+ 
+@@ -1549,7 +1556,8 @@ static int mpu_timer_ioctl(int dev, unsi
+ 				int val;
+ 				int ret;
+ 
+-				val = *(int *) arg;
++				if (get_user(val, p))
++					return -EFAULT;
+ 
+ 				if (val)
+ 				{
+@@ -1564,7 +1572,9 @@ static int mpu_timer_ioctl(int dev, unsi
+ 					}
+ 					curr_tempo = val;
+ 				}
+-				return (*(int *) arg = curr_tempo);
++				if (put_user(curr_tempo, p))
++					return -EFAULT;
++				return curr_tempo;
+ 			}
+ 			break;
+ 
+@@ -1572,18 +1582,25 @@ static int mpu_timer_ioctl(int dev, unsi
+ 			{
+ 				int val;
+ 
+-				val = *(int *) arg;
++				if (get_user(val, p))
++					return -EFAULT;
+ 				if (val != 0)		/* Can't change */
+ 					return -EINVAL;
+-				return (*(int *) arg = ((curr_tempo * curr_timebase) + 30) / 60);
++				val = (curr_tempo * curr_timebase + 30) / 60;
++				if (put_user(val, p))
++					return -EFAULT;
++				return val;
+ 			}
+ 			break;
+ 
+ 		case SNDCTL_SEQ_GETTIME:
+-			return (*(int *) arg = curr_ticks);
++			if (put_user(curr_ticks, p))
++				return -EFAULT;
++			return curr_ticks;
+ 
+ 		case SNDCTL_TMR_METRONOME:
+-			metronome_mode = *(int *) arg;
++			if (get_user(metronome_mode, p))
++				return -EFAULT;
+ 			setup_metronome(midi_dev);
+ 			return 0;
+ 
+--- linux/drivers/sound/msnd.c.bak	Wed Jun 16 14:42:24 2004
++++ linux/drivers/sound/msnd.c	Wed Jun 16 14:42:34 2004
+@@ -155,13 +155,10 @@ void msnd_fifo_make_empty(msnd_fifo *f)
+ 	f->len = f->tail = f->head = 0;
+ }
+ 
+-int msnd_fifo_write(msnd_fifo *f, const char *buf, size_t len, int user)
++int msnd_fifo_write(msnd_fifo *f, const char *buf, size_t len)
+ {
+ 	int count = 0;
+ 
+-	if (f->len == f->n)
+-		return 0;
+-
+ 	while ((count < len) && (f->len != f->n)) {
+ 
+ 		int nwritten;
+@@ -177,11 +174,7 @@ int msnd_fifo_write(msnd_fifo *f, const 
+ 				nwritten = len - count;
+ 		}
+ 
+-		if (user) {
+-			if (copy_from_user(f->data + f->tail, buf, nwritten))
+-				return -EFAULT;
+-		} else
+-			isa_memcpy_fromio(f->data + f->tail, (unsigned long) buf, nwritten);
++		isa_memcpy_fromio(f->data + f->tail, (unsigned long) buf, nwritten);
+ 
+ 		count += nwritten;
+ 		buf += nwritten;
+@@ -193,13 +186,10 @@ int msnd_fifo_write(msnd_fifo *f, const 
+ 	return count;
+ }
+ 
+-int msnd_fifo_read(msnd_fifo *f, char *buf, size_t len, int user)
++int msnd_fifo_read(msnd_fifo *f, char *buf, size_t len)
+ {
+ 	int count = 0;
+ 
+-	if (f->len == 0)
+-		return f->len;
+-
+ 	while ((count < len) && (f->len > 0)) {
+ 
+ 		int nread;
+@@ -215,11 +205,7 @@ int msnd_fifo_read(msnd_fifo *f, char *b
+ 				nread = len - count;
+ 		}
+ 
+-		if (user) {
+-			if (copy_to_user(buf, f->data + f->head, nread))
+-				return -EFAULT;
+-		} else
+-			isa_memcpy_toio((unsigned long) buf, f->data + f->head, nread);
++		isa_memcpy_toio((unsigned long) buf, f->data + f->head, nread);
+ 
+ 		count += nread;
+ 		buf += nread;
+--- linux/drivers/sound/msnd.h.bak	Wed Jun 16 14:42:24 2004
++++ linux/drivers/sound/msnd.h	Wed Jun 16 14:42:34 2004
+@@ -266,8 +266,8 @@ void				msnd_fifo_init(msnd_fifo *f);
+ void				msnd_fifo_free(msnd_fifo *f);
+ int				msnd_fifo_alloc(msnd_fifo *f, size_t n);
+ void				msnd_fifo_make_empty(msnd_fifo *f);
+-int				msnd_fifo_write(msnd_fifo *f, const char *buf, size_t len, int user);
+-int				msnd_fifo_read(msnd_fifo *f, char *buf, size_t len, int user);
++int				msnd_fifo_write(msnd_fifo *f, const char *buf, size_t len);
++int				msnd_fifo_read(msnd_fifo *f, char *buf, size_t len);
+ 
+ int				msnd_wait_TXDE(multisound_dev_t *dev);
+ int				msnd_wait_HC0(multisound_dev_t *dev);
+--- linux/drivers/sound/msnd_pinnacle.c.bak	Wed Jun 16 14:42:24 2004
++++ linux/drivers/sound/msnd_pinnacle.c	Wed Jun 16 14:42:34 2004
+@@ -804,7 +804,7 @@ static int dev_release(struct inode *ino
+ 
+ static __inline__ int pack_DARQ_to_DARF(register int bank)
+ {
+-	register int size, n, timeout = 3;
++	register int size, timeout = 3;
+ 	register WORD wTmp;
+ 	LPDAQD DAQD;
+ 
+@@ -825,13 +825,10 @@ static __inline__ int pack_DARQ_to_DARF(
+ 	/* Read data from the head (unprotected bank 1 access okay
+            since this is only called inside an interrupt) */
+ 	outb(HPBLKSEL_1, dev.io + HP_BLKS);
+-	if ((n = msnd_fifo_write(
++	msnd_fifo_write(
+ 		&dev.DARF,
+ 		(char *)(dev.base + bank * DAR_BUFF_SIZE),
+-		size, 0)) <= 0) {
+-		outb(HPBLKSEL_0, dev.io + HP_BLKS);
+-		return n;
+-	}
++		size);
+ 	outb(HPBLKSEL_0, dev.io + HP_BLKS);
+ 
+ 	return 1;
+@@ -853,21 +850,16 @@ static __inline__ int pack_DAPF_to_DAPQ(
+ 		if (protect) {
+ 			/* Critical section: protect fifo in non-interrupt */
+ 			spin_lock_irqsave(&dev.lock, flags);
+-			if ((n = msnd_fifo_read(
++			n = msnd_fifo_read(
+ 				&dev.DAPF,
+ 				(char *)(dev.base + bank_num * DAP_BUFF_SIZE),
+-				DAP_BUFF_SIZE, 0)) < 0) {
+-				spin_unlock_irqrestore(&dev.lock, flags);
+-				return n;
+-			}
++				DAP_BUFF_SIZE);
+ 			spin_unlock_irqrestore(&dev.lock, flags);
+ 		} else {
+-			if ((n = msnd_fifo_read(
++			n = msnd_fifo_read(
+ 				&dev.DAPF,
+ 				(char *)(dev.base + bank_num * DAP_BUFF_SIZE),
+-				DAP_BUFF_SIZE, 0)) < 0) {
+-				return n;
+-			}
++				DAP_BUFF_SIZE);
+ 		}
+ 		if (!n)
+ 			break;
+@@ -894,30 +886,43 @@ static __inline__ int pack_DAPF_to_DAPQ(
+ static int dsp_read(char *buf, size_t len)
+ {
+ 	int count = len;
++	char *page = (char *)__get_free_page(PAGE_SIZE);
++
++	if (!page)
++		return -ENOMEM;
+ 
+ 	while (count > 0) {
+-		int n;
++		int n, k;
+ 		unsigned long flags;
+ 
++		k = PAGE_SIZE;
++		if (k > count)
++			k = count;
++
+ 		/* Critical section: protect fifo in non-interrupt */
+ 		spin_lock_irqsave(&dev.lock, flags);
+-		if ((n = msnd_fifo_read(&dev.DARF, buf, count, 1)) < 0) {
+-			printk(KERN_WARNING LOGNAME ": FIFO read error\n");
+-			spin_unlock_irqrestore(&dev.lock, flags);
+-			return n;
+-		}
++		n = msnd_fifo_read(&dev.DARF, page, k);
+ 		spin_unlock_irqrestore(&dev.lock, flags);
++		if (copy_to_user(buf, page, n)) {
++			free_page((unsigned long)page);
++			return -EFAULT;
++		}
+ 		buf += n;
+ 		count -= n;
+ 
++		if (n == k && count)
++			continue;
++
+ 		if (!test_bit(F_READING, &dev.flags) && dev.mode & FMODE_READ) {
+ 			dev.last_recbank = -1;
+ 			if (chk_send_dsp_cmd(&dev, HDEX_RECORD_START) == 0)
+ 				set_bit(F_READING, &dev.flags);
+ 		}
+ 
+-		if (dev.rec_ndelay)
++		if (dev.rec_ndelay) {
++			free_page((unsigned long)page);
+ 			return count == len ? -EAGAIN : len - count;
++		}
+ 
+ 		if (count > 0) {
+ 			set_bit(F_READBLOCK, &dev.flags);
+@@ -926,41 +931,57 @@ static int dsp_read(char *buf, size_t le
+ 				get_rec_delay_jiffies(DAR_BUFF_SIZE)))
+ 				clear_bit(F_READING, &dev.flags);
+ 			clear_bit(F_READBLOCK, &dev.flags);
+-			if (signal_pending(current))
++			if (signal_pending(current)) {
++				free_page((unsigned long)page);
+ 				return -EINTR;
++			}
+ 		}
+ 	}
+-
++	free_page((unsigned long)page);
+ 	return len - count;
+ }
+ 
+ static int dsp_write(const char *buf, size_t len)
+ {
+ 	int count = len;
++	char *page = (char *)__get_free_page(GFP_KERNEL);
++
++	if (!page)
++		return -ENOMEM;
+ 
+ 	while (count > 0) {
+-		int n;
++		int n, k;
+ 		unsigned long flags;
+ 
++		k = PAGE_SIZE;
++		if (k > count)
++			k = count;
++
++		if (copy_from_user(page, buf, k)) {
++			free_page((unsigned long)page);
++			return -EFAULT;
++		}
++
+ 		/* Critical section: protect fifo in non-interrupt */
+ 		spin_lock_irqsave(&dev.lock, flags);
+-		if ((n = msnd_fifo_write(&dev.DAPF, buf, count, 1)) < 0) {
+-			printk(KERN_WARNING LOGNAME ": FIFO write error\n");
+-			spin_unlock_irqrestore(&dev.lock, flags);
+-			return n;
+-		}
++		n = msnd_fifo_write(&dev.DAPF, page, k);
+ 		spin_unlock_irqrestore(&dev.lock, flags);
+ 		buf += n;
+ 		count -= n;
+ 
++		if (count && n == k)
++			continue;
++
+ 		if (!test_bit(F_WRITING, &dev.flags) && (dev.mode & FMODE_WRITE)) {
+ 			dev.last_playbank = -1;
+ 			if (pack_DAPF_to_DAPQ(1) > 0)
+ 				set_bit(F_WRITING, &dev.flags);
+ 		}
+ 
+-		if (dev.play_ndelay)
++		if (dev.play_ndelay) {
++			free_page((unsigned long)page);
+ 			return count == len ? -EAGAIN : len - count;
++		}
+ 
+ 		if (count > 0) {
+ 			set_bit(F_WRITEBLOCK, &dev.flags);
+@@ -968,11 +989,14 @@ static int dsp_write(const char *buf, si
+ 				&dev.writeblock,
+ 				get_play_delay_jiffies(DAP_BUFF_SIZE));
+ 			clear_bit(F_WRITEBLOCK, &dev.flags);
+-			if (signal_pending(current))
++			if (signal_pending(current)) {
++				free_page((unsigned long)page);
+ 				return -EINTR;
++			}
+ 		}
+ 	}
+ 
++	free_page((unsigned long)page);
+ 	return len - count;
+ }
+ 
+--- linux/drivers/sound/pss.c.bak	Wed Jun 16 14:42:24 2004
++++ linux/drivers/sound/pss.c	Wed Jun 16 14:42:34 2004
+@@ -450,20 +450,36 @@ static void pss_mixer_reset(pss_confdata
+ 	}
+ }
+ 
+-static void arg_to_volume_mono(unsigned int volume, int *aleft)
++static int set_volume_mono(caddr_t p, int *aleft)
+ {
+ 	int left;
++	unsigned volume;
++	if (get_user(volume, (unsigned *)p))
++		return -EFAULT;
+ 	
+-	left = volume & 0x00ff;
++	left = volume & 0xff;
+ 	if (left > 100)
+ 		left = 100;
+ 	*aleft = left;
++	return 0;
+ }
+ 
+-static void arg_to_volume_stereo(unsigned int volume, int *aleft, int *aright)
++static int set_volume_stereo(caddr_t p, int *aleft, int *aright)
+ {
+-	arg_to_volume_mono(volume, aleft);
+-	arg_to_volume_mono(volume >> 8, aright);
++	int left, right;
++	unsigned volume;
++	if (get_user(volume, (unsigned *)p))
++		return -EFAULT;
++
++	left = volume & 0xff;
++	if (left > 100)
++		left = 100;
++	right = (volume >> 8) & 0xff;
++	if (right > 100)
++		right = 100;
++	*aleft = left;
++	*aright = right;
++	return 0;
+ }
+ 
+ static int ret_vol_mono(int left)
+@@ -510,33 +526,38 @@ static int pss_mixer_ioctl (int dev, uns
+ 					return call_ad_mixer(devc, cmd, arg);
+ 				else
+ 				{
+-					if (*(int *)arg != 0)
++					int v;
++					if (get_user(v, (int *)arg))
++						return -EFAULT;
++					if (v != 0)
+ 						return -EINVAL;
+ 					return 0;
+ 				}
+ 			case SOUND_MIXER_VOLUME:
+-				arg_to_volume_stereo(*(unsigned int *)arg, &devc->mixer.volume_l,
+-					&devc->mixer.volume_r); 
++				if (set_volume_stereo(arg,
++					&devc->mixer.volume_l,
++					&devc->mixer.volume_r))
++					return -EFAULT;
+ 				set_master_volume(devc, devc->mixer.volume_l,
+ 					devc->mixer.volume_r);
+ 				return ret_vol_stereo(devc->mixer.volume_l,
+ 					devc->mixer.volume_r);
+ 		  
+ 			case SOUND_MIXER_BASS:
+-				arg_to_volume_mono(*(unsigned int *)arg,
+-					&devc->mixer.bass);
++				if (set_volume_mono(arg, &devc->mixer.bass))
++					return -EFAULT;
+ 				set_bass(devc, devc->mixer.bass);
+ 				return ret_vol_mono(devc->mixer.bass);
+ 		  
+ 			case SOUND_MIXER_TREBLE:
+-				arg_to_volume_mono(*(unsigned int *)arg,
+-					&devc->mixer.treble);
++				if (set_volume_mono(arg, &devc->mixer.treble))
++					return -EFAULT;
+ 				set_treble(devc, devc->mixer.treble);
+ 				return ret_vol_mono(devc->mixer.treble);
+ 		  
+ 			case SOUND_MIXER_SYNTH:
+-				arg_to_volume_mono(*(unsigned int *)arg,
+-					&devc->mixer.synth);
++				if (set_volume_mono(arg, &devc->mixer.synth))
++					return -EFAULT;
+ 				set_synth_volume(devc, devc->mixer.synth);
+ 				return ret_vol_mono(devc->mixer.synth);
+ 		  
+@@ -546,54 +567,67 @@ static int pss_mixer_ioctl (int dev, uns
+ 	}
+ 	else			
+ 	{
++		int val, and_mask = 0, or_mask = 0;
+ 		/*
+ 		 * Return parameters
+ 		 */
+ 		switch (cmdf)
+ 		{
+-
+ 			case SOUND_MIXER_DEVMASK:
+ 				if (call_ad_mixer(devc, cmd, arg) == -EINVAL)
+-					*(int *)arg = 0; /* no mixer devices */
+-				return (*(int *)arg |= SOUND_MASK_VOLUME | SOUND_MASK_BASS | SOUND_MASK_TREBLE | SOUND_MASK_SYNTH);
++					break;
++				and_mask = ~0;
++				or_mask = SOUND_MASK_VOLUME | SOUND_MASK_BASS | SOUND_MASK_TREBLE | SOUND_MASK_SYNTH;
++				break;
+ 		  
+ 			case SOUND_MIXER_STEREODEVS:
+ 				if (call_ad_mixer(devc, cmd, arg) == -EINVAL)
+-					*(int *)arg = 0; /* no stereo devices */
+-				return (*(int *)arg |= SOUND_MASK_VOLUME);
++					break;
++				and_mask = ~0;
++				or_mask = SOUND_MASK_VOLUME;
++				break;
+ 		  
+ 			case SOUND_MIXER_RECMASK:
+ 				if (devc->ad_mixer_dev != NO_WSS_MIXER)
+ 					return call_ad_mixer(devc, cmd, arg);
+-				else
+-					return (*(int *)arg = 0); /* no record devices */
++				break;
+ 
+ 			case SOUND_MIXER_CAPS:
+ 				if (devc->ad_mixer_dev != NO_WSS_MIXER)
+ 					return call_ad_mixer(devc, cmd, arg);
+-				else
+-					return (*(int *)arg = SOUND_CAP_EXCL_INPUT);
++				or_mask = SOUND_CAP_EXCL_INPUT;
++				break;
+ 
+ 			case SOUND_MIXER_RECSRC:
+ 				if (devc->ad_mixer_dev != NO_WSS_MIXER)
+ 					return call_ad_mixer(devc, cmd, arg);
+-				else
+-					return (*(int *)arg = 0); /* no record source */
++				break;
+ 
+ 			case SOUND_MIXER_VOLUME:
+-				return (*(int *)arg = ret_vol_stereo(devc->mixer.volume_l, devc->mixer.volume_r));
++				or_mask =  ret_vol_stereo(devc->mixer.volume_l, devc->mixer.volume_r);
++				break;
+ 			  
+ 			case SOUND_MIXER_BASS:
+-				return (*(int *)arg = ret_vol_mono(devc->mixer.bass));
++				or_mask =  ret_vol_mono(devc->mixer.bass);
++				break;
+ 			  
+ 			case SOUND_MIXER_TREBLE:
+-				return (*(int *)arg = ret_vol_mono(devc->mixer.treble));
++				or_mask = ret_vol_mono(devc->mixer.treble);
++				break;
+ 			  
+ 			case SOUND_MIXER_SYNTH:
+-				return (*(int *)arg = ret_vol_mono(devc->mixer.synth));
++				or_mask = ret_vol_mono(devc->mixer.synth);
++				break;
+ 			default:
+ 				return -EINVAL;
+ 		}
++		if (get_user(val, (int *)arg))
++			return -EFAULT;
++		val &= and_mask;
++		val |= or_mask;
++		if (put_user(val, (int *)arg))
++			return -EFAULT;
++		return val;
+ 	}
+ }
+ 
diff --git a/sys-kernel/uclinux-sources/files/uclinux-sources-2.4.26_p0.CAN-2004-0535.patch b/sys-kernel/uclinux-sources/files/uclinux-sources-2.4.26_p0.CAN-2004-0535.patch
new file mode 100644
index 000000000000..669fc5fd32fb
--- /dev/null
+++ b/sys-kernel/uclinux-sources/files/uclinux-sources-2.4.26_p0.CAN-2004-0535.patch
@@ -0,0 +1,12 @@
+--- drivers/net/e1000/e1000_ethtool.c	2003-06-13 15:51:34.000000000 +0100
++++ drivers/net/e1000/e1000_ethtool.c.plasmaroo	2004-06-24 11:23:32.524963976 +0100
+@@ -468,6 +468,9 @@
+ 
+ 		if(copy_from_user(&regs, addr, sizeof(regs)))
+ 			return -EFAULT;
++		memset(regs_buff, 0, sizeof(regs_buff));
++		if (regs.len > E1000_REGS_LEN)
++			regs.len = E1000_REGS_LEN;
+ 		e1000_ethtool_gregs(adapter, &regs, regs_buff);
+ 		if(copy_to_user(addr, &regs, sizeof(regs)))
+ 			return -EFAULT;
diff --git a/sys-kernel/uclinux-sources/files/uclinux-sources-2.6.6_p0.FPULockup-53804.patch b/sys-kernel/uclinux-sources/files/uclinux-sources-2.6.6_p0.FPULockup-53804.patch
deleted file mode 100644
index a813f48ec23b..000000000000
--- a/sys-kernel/uclinux-sources/files/uclinux-sources-2.6.6_p0.FPULockup-53804.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-diff -Nru a/include/asm-i386/i387.h b/include/asm-i386/i387.h
---- a/include/asm-i386/i387.h	2004-05-06 12:26:10 -07:00
-+++ b/include/asm-i386/i387.h	2004-06-12 19:12:23 -07:00
-@@ -51,7 +51,7 @@
- #define __clear_fpu( tsk )					\
- do {								\
- 	if ((tsk)->thread_info->status & TS_USEDFPU) {		\
--		asm volatile("fwait");				\
-+		asm volatile("fnclex ; fwait");			\
- 		(tsk)->thread_info->status &= ~TS_USEDFPU;	\
- 		stts();						\
- 	}							\
-diff -Nru a/include/asm-x86_64/i387.h b/include/asm-x86_64/i387.h
---- a/include/asm-x86_64/i387.h	2004-06-13 20:43:56.742530792 +0100
-+++ a/include/asm-x86_64/i387.h	2004-06-13 20:42:59.200278544 +0100
-@@ -46,7 +46,7 @@
- 
- #define clear_fpu(tsk) do { \
- 	if ((tsk)->thread_info->status & TS_USEDFPU) {		\
--		asm volatile("fwait");				\
-+		asm volatile("fnclex; fwait");			\
- 		(tsk)->thread_info->status &= ~TS_USEDFPU;	\
- 		stts();						\
- 	}							\
diff --git a/sys-kernel/uclinux-sources/uclinux-sources-2.4.26_p0-r1.ebuild b/sys-kernel/uclinux-sources/uclinux-sources-2.4.26_p0-r1.ebuild
deleted file mode 100644
index a2afa940e0b8..000000000000
--- a/sys-kernel/uclinux-sources/uclinux-sources-2.4.26_p0-r1.ebuild
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright 1999-2004 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-# $Header: /var/cvsroot/gentoo-x86/sys-kernel/uclinux-sources/uclinux-sources-2.4.26_p0-r1.ebuild,v 1.2 2004/06/24 23:01:30 agriffis Exp $
-
-IUSE=""
-
-ETYPE="sources"
-inherit kernel eutils
-OKV="`echo ${PV}|sed -e 's:^\([0-9]\+\.[0-9]\+\.[0-9]\+\).*:\1:'`"
-
-EXTRAVERSION="uc${PV/*_p/}"
-[ ! "${PR}" == "r0" ] && EXTRAVERSION="${EXTRAVERSION}-${PR}"
-KV="${OKV}-${EXTRAVERSION}"
-
-# Get the major & minor kernel version
-MMV=`echo $PV | awk -F. '{print $1"."$2}'`
-
-patch="diff"
-base="uClinux"
-if [ ${MMV} == "2.6" ]; then
-	patch="patch"
-	base="linux"
-fi
-
-MY_P=linux-${PV/_p/-uc}
-
-S=${WORKDIR}/linux-${KV}
-DESCRIPTION="uCLinux kernel patches for CPUs without MMUs"
-SRC_URI="mirror://kernel/v${MMV}/linux-${OKV}.tar.bz2
-	http://www.uclinux.org/pub/uClinux/uClinux-${MMV}.x/${MY_P/linux/${base}}.${patch}.gz"
-
-HOMEPAGE="http://www.uclinux.org/"
-KEYWORDS="~x86 -ppc"
-SLOT="${KV}"
-
-src_unpack() {
-	unpack ${A}
-	mv linux-${OKV} linux-${KV} || die
-
-	cd linux-${KV}
-	epatch ../${MY_P/linux/${base}}.${patch} || die "Failed to apply uClinux patch!"
-
-	set MY_ARCH=${ARCH}
-	unset ARCH
-	rm ../${MY_P/linux/${base}}.${patch}
-
-	epatch ${FILESDIR}/${P}.CAN-2004-0394.patch || die "Failed to add the CAN-2004-0394 patch!"
-	epatch ${FILESDIR}/${P}.FPULockup-53804.patch || die "Failed to apply FPU-lockup patch!"
-
-	kernel_universal_unpack
-	set ARCH=${MY_ARCH}
-}
diff --git a/sys-kernel/uclinux-sources/uclinux-sources-2.4.26_p0-r2.ebuild b/sys-kernel/uclinux-sources/uclinux-sources-2.4.26_p0-r2.ebuild
new file mode 100644
index 000000000000..641edc1dfd51
--- /dev/null
+++ b/sys-kernel/uclinux-sources/uclinux-sources-2.4.26_p0-r2.ebuild
@@ -0,0 +1,54 @@
+# Copyright 1999-2004 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/sys-kernel/uclinux-sources/uclinux-sources-2.4.26_p0-r2.ebuild,v 1.1 2004/06/25 20:15:29 plasmaroo Exp $
+
+IUSE=""
+
+ETYPE="sources"
+inherit kernel eutils
+OKV="`echo ${PV}|sed -e 's:^\([0-9]\+\.[0-9]\+\.[0-9]\+\).*:\1:'`"
+
+EXTRAVERSION="uc${PV/*_p/}"
+[ ! "${PR}" == "r0" ] && EXTRAVERSION="${EXTRAVERSION}-${PR}"
+KV="${OKV}-${EXTRAVERSION}"
+
+# Get the major & minor kernel version
+MMV=`echo $PV | awk -F. '{print $1"."$2}'`
+
+patch="diff"
+base="uClinux"
+if [ ${MMV} == "2.6" ]; then
+	patch="patch"
+	base="linux"
+fi
+
+MY_P=linux-${PV/_p/-uc}
+
+S=${WORKDIR}/linux-${KV}
+DESCRIPTION="uCLinux kernel patches for CPUs without MMUs"
+SRC_URI="mirror://kernel/v${MMV}/linux-${OKV}.tar.bz2
+	http://www.uclinux.org/pub/uClinux/uClinux-${MMV}.x/${MY_P/linux/${base}}.${patch}.gz"
+
+HOMEPAGE="http://www.uclinux.org/"
+KEYWORDS="~x86 -ppc"
+SLOT="${KV}"
+
+src_unpack() {
+	unpack ${A}
+	mv linux-${OKV} linux-${KV} || die
+
+	cd linux-${KV}
+	epatch ../${MY_P/linux/${base}}.${patch} || die "Failed to apply uClinux patch!"
+
+	set MY_ARCH=${ARCH}
+	unset ARCH
+	rm ../${MY_P/linux/${base}}.${patch}
+
+	epatch ${FILESDIR}/${P}.CAN-2004-0394.patch || die "Failed to add the CAN-2004-0394 patch!"
+	epatch ${FILESDIR}/${P}.CAN-2004-0495.patch || die "Failed to add the CAN-2004-0495 patch!"
+	epatch ${FILESDIR}/${P}.CAN-2004-0535.patch || die "Failed to add the CAN-2004-0535 patch!"
+	epatch ${FILESDIR}/${P}.FPULockup-53804.patch || die "Failed to apply FPU-lockup patch!"
+
+	kernel_universal_unpack
+	set ARCH=${MY_ARCH}
+}
diff --git a/sys-kernel/uclinux-sources/uclinux-sources-2.6.6_p0-r1.ebuild b/sys-kernel/uclinux-sources/uclinux-sources-2.6.6_p0-r1.ebuild
deleted file mode 100644
index 4afd25f85cee..000000000000
--- a/sys-kernel/uclinux-sources/uclinux-sources-2.6.6_p0-r1.ebuild
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright 1999-2004 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-# $Header: /var/cvsroot/gentoo-x86/sys-kernel/uclinux-sources/uclinux-sources-2.6.6_p0-r1.ebuild,v 1.2 2004/06/24 23:01:30 agriffis Exp $
-
-IUSE=""
-
-ETYPE="sources"
-inherit kernel eutils
-OKV="`echo ${PV}|sed -e 's:^\([0-9]\+\.[0-9]\+\.[0-9]\+\).*:\1:'`"
-
-EXTRAVERSION="uc${PV/*_p/}"
-[ "${PR}" != "r0" ] && EXTRAVERSION="${EXTRAVERSION}-${PR}"
-KV="${OKV}-${EXTRAVERSION}"
-
-# Get the major & minor kernel version
-MMV=`echo $PV | awk -F. '{print $1"."$2}'`
-
-patch="diff"
-base="uClinux"
-if [ ${MMV} == "2.6" ]; then
-	patch="patch"
-	base="linux"
-fi
-
-MY_P=linux-${PV/_p/-uc}
-
-S=${WORKDIR}/linux-${KV}
-DESCRIPTION="uCLinux kernel patches for CPUs without MMUs"
-SRC_URI="mirror://kernel/v${MMV}/linux-${OKV}.tar.bz2
-	http://www.uclinux.org/pub/uClinux/uClinux-${MMV}.x/${MY_P/linux/${base}}.${patch}.gz"
-
-HOMEPAGE="http://www.uclinux.org/"
-KEYWORDS="~x86 -ppc"
-SLOT="${KV}"
-
-src_unpack() {
-	unpack ${A}
-	mv linux-${OKV} linux-${KV} || die
-
-	cd linux-${KV}
-	epatch ../${MY_P/linux/${base}}.${patch} || die "Failed to apply uClinux patch!"
-
-	set MY_ARCH=${ARCH}
-	unset ARCH
-	rm ../${MY_P/linux/${base}}.${patch}
-
-	epatch ${FILESDIR}/${P}.FPULockup-53804.patch || die "Failed to apply FPU-lockup patch!"
-
-	kernel_universal_unpack
-	set ARCH=${MY_ARCH}
-}
diff --git a/sys-kernel/uclinux-sources/uclinux-sources-2.6.7_p0.ebuild b/sys-kernel/uclinux-sources/uclinux-sources-2.6.7_p0.ebuild
new file mode 100644
index 000000000000..e2e433728ef2
--- /dev/null
+++ b/sys-kernel/uclinux-sources/uclinux-sources-2.6.7_p0.ebuild
@@ -0,0 +1,49 @@
+# Copyright 1999-2004 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/sys-kernel/uclinux-sources/uclinux-sources-2.6.7_p0.ebuild,v 1.1 2004/06/25 20:15:29 plasmaroo Exp $
+
+IUSE=""
+
+ETYPE="sources"
+inherit kernel eutils
+OKV="`echo ${PV}|sed -e 's:^\([0-9]\+\.[0-9]\+\.[0-9]\+\).*:\1:'`"
+
+EXTRAVERSION="uc${PV/*_p/}"
+[ "${PR}" != "r0" ] && EXTRAVERSION="${EXTRAVERSION}-${PR}"
+KV="${OKV}-${EXTRAVERSION}"
+
+# Get the major & minor kernel version
+MMV=`echo $PV | awk -F. '{print $1"."$2}'`
+
+patch="diff"
+base="uClinux"
+if [ ${MMV} == "2.6" ]; then
+	patch="patch"
+	base="linux"
+fi
+
+MY_P=linux-${PV/_p/-uc}
+
+S=${WORKDIR}/linux-${KV}
+DESCRIPTION="uCLinux kernel patches for CPUs without MMUs"
+SRC_URI="mirror://kernel/v${MMV}/linux-${OKV}.tar.bz2
+	http://www.uclinux.org/pub/uClinux/uClinux-${MMV}.x/${MY_P/linux/${base}}.${patch}.gz"
+
+HOMEPAGE="http://www.uclinux.org/"
+KEYWORDS="~x86 -ppc"
+SLOT="${KV}"
+
+src_unpack() {
+	unpack ${A}
+	mv linux-${OKV} linux-${KV} || die
+
+	cd linux-${KV}
+	epatch ../${MY_P/linux/${base}}.${patch} || die "Failed to apply uClinux patch!"
+
+	set MY_ARCH=${ARCH}
+	unset ARCH
+	rm ../${MY_P/linux/${base}}.${patch}
+
+	kernel_universal_unpack
+	set ARCH=${MY_ARCH}
+}
-- 
cgit v1.2.3-65-gdbad