diff options
| author | augustss <augustss@NetBSD.org> | 2001-12-13 15:09:07 +0000 |
|---|---|---|
| committer | augustss <augustss@NetBSD.org> | 2001-12-13 15:09:07 +0000 |
| commit | 090d1a628e6809e80c8aeb8ef6dd829c329f6c85 (patch) | |
| tree | 0c06112d009611a246df3ff6bc713fc37b93e4c8 /sys/dev/ir | |
| parent | 2485171a677b93a1784bd52b98a1a1ed19d24b2c (diff) | |
Move parameter checks to a common place.
Diffstat (limited to 'sys/dev/ir')
| -rw-r--r-- | sys/dev/ir/irdaio.h | 12 | ||||
| -rw-r--r-- | sys/dev/ir/irframe.c | 22 | ||||
| -rw-r--r-- | sys/dev/ir/irframe_tty.c | 18 | ||||
| -rw-r--r-- | sys/dev/ir/irframevar.h | 7 |
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 *); |
