summaryrefslogtreecommitdiff
path: root/sys/dev/ir
diff options
context:
space:
mode:
authoraugustss <augustss@NetBSD.org>2001-12-13 15:09:07 +0000
committeraugustss <augustss@NetBSD.org>2001-12-13 15:09:07 +0000
commit090d1a628e6809e80c8aeb8ef6dd829c329f6c85 (patch)
tree0c06112d009611a246df3ff6bc713fc37b93e4c8 /sys/dev/ir
parent2485171a677b93a1784bd52b98a1a1ed19d24b2c (diff)
Move parameter checks to a common place.
Diffstat (limited to 'sys/dev/ir')
-rw-r--r--sys/dev/ir/irdaio.h12
-rw-r--r--sys/dev/ir/irframe.c22
-rw-r--r--sys/dev/ir/irframe_tty.c18
-rw-r--r--sys/dev/ir/irframevar.h7
4 files changed, 37 insertions, 22 deletions
diff --git a/sys/dev/ir/irdaio.h b/sys/dev/ir/irdaio.h
index 2462266c618..392ef00d517 100644
--- a/sys/dev/ir/irdaio.h
+++ b/sys/dev/ir/irdaio.h
@@ -1,4 +1,4 @@
-/* $NetBSD: irdaio.h,v 1.5 2001/12/13 00:33:36 augustss Exp $ */
+/* $NetBSD: irdaio.h,v 1.6 2001/12/13 15:09:07 augustss Exp $ */
/*
* Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -77,14 +77,14 @@ struct irda_params {
/* Coordinate numbering with cirio.h. */
#define IRDA_RESET_PARAMS _IO ('I', 1)
#define IRDA_SET_PARAMS _IOW('I', 2, struct irda_params)
-#define IRDA_GET_SPEEDMASK _IOR('I', 3, int)
-#define IRDA_GET_TURNAROUNDMASK _IOR('I', 4, int)
+#define IRDA_GET_SPEEDMASK _IOR('I', 3, unsigned int)
+#define IRDA_GET_TURNAROUNDMASK _IOR('I', 4, unsigned int)
/* irframetty device ioctls */
-#define IRFRAMETTY_GET_DEVICE _IOR('I', 100, int)
-#define IRFRAMETTY_GET_DONGLE _IOR('I', 101, int)
-#define IRFRAMETTY_SET_DONGLE _IOW('I', 102, int)
+#define IRFRAMETTY_GET_DEVICE _IOR('I', 100, unsigned int)
+#define IRFRAMETTY_GET_DONGLE _IOR('I', 101, unsigned int)
+#define IRFRAMETTY_SET_DONGLE _IOW('I', 102, unsigned int)
#define DONGLE_NONE 0
#define DONGLE_TEKRAM 1
#define DONGLE_JETEYE 2
diff --git a/sys/dev/ir/irframe.c b/sys/dev/ir/irframe.c
index 9a272774f84..27abe261e8b 100644
--- a/sys/dev/ir/irframe.c
+++ b/sys/dev/ir/irframe.c
@@ -1,4 +1,4 @@
-/* $NetBSD: irframe.c,v 1.10 2001/12/13 00:33:58 augustss Exp $ */
+/* $NetBSD: irframe.c,v 1.11 2001/12/13 15:09:07 augustss Exp $ */
/*
* Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -109,6 +109,7 @@ irframe_attach(struct device *parent, struct device *self, void *aux)
#endif
(void)sc->sc_methods->im_get_speeds(sc->sc_handle, &speeds);
+ sc->sc_speedmask = speeds;
delim = ":";
if (speeds & IRDA_SPEEDS_SIR) {
printf("%s SIR", delim);
@@ -182,6 +183,9 @@ irframeopen(dev_t dev, int flag, int mode, struct proc *p)
return (error);
}
sc->sc_open = 1;
+#ifdef DIAGNOSTIC
+ sc->sc_speed = IRDA_DEFAULT_SPEED;
+#endif
(void)irf_reset_params(sc);
return (0);
}
@@ -213,6 +217,8 @@ irframeread(dev_t dev, struct uio *uio, int flag)
return (ENXIO);
if ((sc->sc_dev.dv_flags & DVF_ACTIVE) == 0)
return (EIO);
+ if (uio->uio_resid < sc->sc_params.maxsize)
+ return (EINVAL);
return (sc->sc_methods->im_read(sc->sc_handle, uio, flag));
}
@@ -226,6 +232,8 @@ irframewrite(dev_t dev, struct uio *uio, int flag)
return (ENXIO);
if ((sc->sc_dev.dv_flags & DVF_ACTIVE) == 0)
return (EIO);
+ if (uio->uio_resid > sc->sc_params.maxsize)
+ return (EINVAL);
return (sc->sc_methods->im_write(sc->sc_handle, uio, flag));
}
@@ -245,6 +253,7 @@ irframeioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p)
{
struct irframe_softc *sc;
void *vaddr = addr;
+ struct irda_params *parms = vaddr;
int error;
sc = device_lookup(&irframe_cd, IRFRAMEUNIT(dev));
@@ -261,13 +270,20 @@ irframeioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p)
case IRDA_SET_PARAMS:
#ifdef DIAGNOSTIC
- if (((struct irda_params *)vaddr)->speed != sc->sc_speed) {
- sc->sc_speed = ((struct irda_params *)vaddr)->speed;
+ if (parms->speed != sc->sc_speed) {
+ sc->sc_speed = parms->speed;
printf("%s: set speed %u\n", sc->sc_dev.dv_xname,
sc->sc_speed);
}
#endif
+ if (parms->maxsize > IRDA_MAX_FRAME_SIZE)
+ return (EINVAL);
+ if (parms->ebofs > IRDA_MAX_EBOFS)
+ return (EINVAL);
+ /* XXX check speed */
error = sc->sc_methods->im_set_params(sc->sc_handle, vaddr);
+ if (!error)
+ sc->sc_params = *parms;
break;
case IRDA_RESET_PARAMS:
diff --git a/sys/dev/ir/irframe_tty.c b/sys/dev/ir/irframe_tty.c
index 4e5f84a75cb..a608986d20f 100644
--- a/sys/dev/ir/irframe_tty.c
+++ b/sys/dev/ir/irframe_tty.c
@@ -1,4 +1,4 @@
-/* $NetBSD: irframe_tty.c,v 1.13 2001/12/12 17:52:06 augustss Exp $ */
+/* $NetBSD: irframe_tty.c,v 1.14 2001/12/13 15:09:07 augustss Exp $ */
/*
* TODO
@@ -83,7 +83,8 @@ int irframetdebug = 0;
/*****/
-#define MAX_IRDA_FRAME 5000 /* XXX what is it? */
+/* Max size with framing. */
+#define MAX_IRDA_FRAME (2*IRDA_MAX_FRAME_SIZE + IRDA_MAX_EBOFS + 4)
struct frame {
u_char *buf;
@@ -662,21 +663,14 @@ irframet_set_params(void *h, struct irda_params *p)
__FUNCTION__, tp, p->speed, p->ebofs, p->maxsize));
if (p->speed != sc->sc_speed) {
- switch (p->speed) {
- case 2400:
- case 9600:
- case 19200:
- case 38400:
- case 57600:
- case 115200:
- break;
- default: return (EINVAL);
- }
+ /* Checked in irframe.c */
irt_dongles[sc->sc_dongle].setspeed(tp, p->speed);
sc->sc_speed = p->speed;
}
+ /* Max size checked in irframe.c */
sc->sc_ebofs = p->ebofs;
+ /* Max size checked in irframe.c */
if (sc->sc_maxsize != p->maxsize) {
sc->sc_maxsize = p->maxsize;
if (sc->sc_inbuf != NULL)
diff --git a/sys/dev/ir/irframevar.h b/sys/dev/ir/irframevar.h
index cd4a0412653..08dd45357cb 100644
--- a/sys/dev/ir/irframevar.h
+++ b/sys/dev/ir/irframevar.h
@@ -1,4 +1,4 @@
-/* $NetBSD: irframevar.h,v 1.7 2001/12/13 00:33:58 augustss Exp $ */
+/* $NetBSD: irframevar.h,v 1.8 2001/12/13 15:09:07 augustss Exp $ */
/*
* Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -52,6 +52,8 @@ struct irframe_softc {
const struct irframe_methods *sc_methods;
void *sc_handle;
char sc_open;
+ struct irda_params sc_params;
+ u_int sc_speedmask;
#ifdef DIAGNOSTIC
u_int sc_speed;
#endif
@@ -63,6 +65,9 @@ void irframe_frame_available(struct device *);
#define IRDA_DEFAULT_EBOFS 12
#define IRDA_DEFAULT_SIZE 386
+#define IRDA_MAX_FRAME_SIZE 2048
+#define IRDA_MAX_EBOFS 64
+
struct device *irframe_alloc(size_t, const struct irframe_methods *, void *);
void irframe_dealloc(struct device *);