summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorjmcneill <jmcneill@NetBSD.org>2011-10-02 17:39:40 +0000
committerjmcneill <jmcneill@NetBSD.org>2011-10-02 17:39:40 +0000
commit1cf81c5a0fbbec151d411f3b954ff0dfef62fbd4 (patch)
tree6dc9b08a574e3f384a7da551eab2829bab6ef312 /sys
parenteddb5b44ce6a3341cae7b8f9462654a84dd70360 (diff)
I2C_IOCTL_EXEC: only allow i2c write ops if the device was opened for writing
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/i2c/i2c.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/sys/dev/i2c/i2c.c b/sys/dev/i2c/i2c.c
index 8fcff0b6fc2..8970f8fbe4e 100644
--- a/sys/dev/i2c/i2c.c
+++ b/sys/dev/i2c/i2c.c
@@ -1,4 +1,4 @@
-/* $NetBSD: i2c.c,v 1.31 2011/10/02 16:39:47 jmcneill Exp $ */
+/* $NetBSD: i2c.c,v 1.32 2011/10/02 17:39:40 jmcneill Exp $ */
/*
* Copyright (c) 2003 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i2c.c,v 1.31 2011/10/02 16:39:47 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i2c.c,v 1.32 2011/10/02 17:39:40 jmcneill Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -47,6 +47,7 @@ __KERNEL_RCSID(0, "$NetBSD: i2c.c,v 1.31 2011/10/02 16:39:47 jmcneill Exp $");
#include <sys/kthread.h>
#include <sys/proc.h>
#include <sys/kernel.h>
+#include <sys/fcntl.h>
#include <sys/module.h>
#include <dev/i2c/i2cvar.h>
@@ -421,7 +422,7 @@ iic_close(dev_t dev, int flag, int fmt, lwp_t *l)
}
static int
-iic_ioctl_exec(struct iic_softc *sc, i2c_ioctl_exec_t *iie)
+iic_ioctl_exec(struct iic_softc *sc, i2c_ioctl_exec_t *iie, int flag)
{
i2c_tag_t ic = sc->sc_tag;
uint8_t buf[I2C_EXEC_MAX_BUFLEN];
@@ -438,6 +439,8 @@ iic_ioctl_exec(struct iic_softc *sc, i2c_ioctl_exec_t *iie)
return EINVAL;
if (iie->iie_buf != NULL && iie->iie_buflen == 0)
return EINVAL;
+ if (I2C_OP_WRITE_P(iie->iie_op) && (flag & FWRITE) == 0)
+ return EBADF;
#if 0
/* Disallow userspace access to devices that have drivers attached. */
@@ -475,7 +478,7 @@ iic_ioctl(dev_t dev, u_long cmd, void *data, int flag, lwp_t *l)
switch (cmd) {
case I2C_IOCTL_EXEC:
- return iic_ioctl_exec(sc, (i2c_ioctl_exec_t *)data);
+ return iic_ioctl_exec(sc, (i2c_ioctl_exec_t *)data, flag);
default:
return ENODEV;
}