All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] cs5535_gpio: Fix root triggerable integer underflow
@ 2009-07-18 11:28 Michael Buesch
  0 siblings, 0 replies; only message in thread
From: Michael Buesch @ 2009-07-18 11:28 UTC (permalink / raw)
  To: Ben Gardner; +Cc: linux-kernel

This patch fixes a possible root triggerable (I hope the device is only
readable by root?) integer underflow.
Well, it's not really an underflow, but as loff_t is a signed type, the
range check at the start of the function is incomplete. It needs to check for <0, too.
Otherwise the loop below will poke into random memory and I/O space.
This could be used to crash the machine, at least.

This patch is only compiletested, because I do not have the hardware.

Signed-off-by: Michael Buesch <mb@bu3sch.de>

---

I'm not sure if this bug is exploitable. I _guess_ the device is only readable by root
on a standard setup.

---
 drivers/char/cs5535_gpio.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- linux-2.6.orig/drivers/char/cs5535_gpio.c
+++ linux-2.6/drivers/char/cs5535_gpio.c
@@ -124,21 +124,21 @@ static ssize_t cs5535_gpio_write(struct 
 static ssize_t cs5535_gpio_read(struct file *file, char __user *buf,
 				size_t len, loff_t *ppos)
 {
 	u32	m = iminor(file->f_path.dentry->d_inode);
 	u32	base = gpio_base + cs5535_lowhigh_base(m);
 	int	rd_bit = 1 << (m & 0x0f);
 	int	i;
 	char	ch;
 	ssize_t	count = 0;
 
-	if (*ppos >= ARRAY_SIZE(rm))
+	if (*ppos < 0 || *ppos >= ARRAY_SIZE(rm))
 		return 0;
 
 	for (i = *ppos; (i < (*ppos + len)) && (i < ARRAY_SIZE(rm)); i++) {
 		ch = (inl(base + rm[i].rd_offset) & rd_bit) ?
 		     rm[i].on : rm[i].off;
 
 		if (put_user(ch, buf+count))
 			return -EFAULT;
 
 		count++;

-- 
Greetings, Michael.

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2009-07-18 11:29 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-07-18 11:28 [PATCH] cs5535_gpio: Fix root triggerable integer underflow Michael Buesch

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.