summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>1995-08-01 23:27:36 +0000
committerache <ache@FreeBSD.org>1995-08-01 23:27:36 +0000
commitcaec2f2ae9e16e3f355b8b1636956da4f12e7c24 (patch)
tree94ae4b90fc88d37d8e12465c9593ee2e457c7dad /sys
parent923e998823f11942a1d9f22ef01d3c3aa0cc4b9e (diff)
downloadFreeBSD-src-caec2f2ae9e16e3f355b8b1636956da4f12e7c24.zip
FreeBSD-src-caec2f2ae9e16e3f355b8b1636956da4f12e7c24.tar.gz
Check for valid speeds in TIOCSET* and return EINVAL for incorrect
values instead of setting garbadge.
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/tty.c20
-rw-r--r--sys/kern/tty_compat.c11
2 files changed, 23 insertions, 8 deletions
diff --git a/sys/kern/tty.c b/sys/kern/tty.c
index 4c57599..81874f8 100644
--- a/sys/kern/tty.c
+++ b/sys/kern/tty.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)tty.c 8.8 (Berkeley) 1/21/94
- * $Id: tty.c,v 1.65 1995/07/31 22:48:33 bde Exp $
+ * $Id: tty.c,v 1.66 1995/07/31 22:50:01 bde Exp $
*/
/*-
@@ -175,6 +175,12 @@ char const char_type[] = {
#undef TB
#undef VT
+int validspeed[] = {
+ 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
+ 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200
+};
+#define MAX_SPEED (sizeof(validspeed)/sizeof(*validspeed) - 1)
+
/* Macros to clear/set/test flags. */
#define SET(t, f) (t) |= (f)
#define CLR(t, f) (t) &= ~(f)
@@ -823,6 +829,18 @@ ttioctl(tp, cmd, data, flag)
case TIOCSETAW: /* drain output, set */
case TIOCSETAF: { /* drn out, fls in, set */
register struct termios *t = (struct termios *)data;
+ register int i;
+
+ for (i = MAX_SPEED; i >= 0; i--)
+ if (t->c_ispeed == validspeed[i])
+ break;
+ if (i < 0)
+ return (EINVAL);
+ for (i = MAX_SPEED; i >= 0; i--)
+ if (t->c_ospeed == validspeed[i])
+ break;
+ if (i < 0)
+ return (EINVAL);
s = spltty();
if (cmd == TIOCSETAW || cmd == TIOCSETAF) {
diff --git a/sys/kern/tty_compat.c b/sys/kern/tty_compat.c
index 9b4b731..628b11c 100644
--- a/sys/kern/tty_compat.c
+++ b/sys/kern/tty_compat.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)tty_compat.c 8.1 (Berkeley) 6/10/93
- * $Id: tty_compat.c,v 1.12 1995/04/11 17:54:25 ache Exp $
+ * $Id: tty_compat.c,v 1.13 1995/05/30 08:06:09 rgrimes Exp $
*/
/*
@@ -78,10 +78,7 @@ static struct speedtab compatspeeds[] = {
{ 0, 0 },
{ -1, -1 },
};
-static int compatspcodes[] = {
- 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
- 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200,
-};
+extern int validspeed[]; /* in tty.c */
int ttsetcompat(tp, com, data, term)
register struct tty *tp;
@@ -98,11 +95,11 @@ int ttsetcompat(tp, com, data, term)
if ((speed = sg->sg_ispeed) > MAX_SPEED || speed < 0)
return(EINVAL);
else
- term->c_ispeed = compatspcodes[speed];
+ term->c_ispeed = validspeed[speed];
if ((speed = sg->sg_ospeed) > MAX_SPEED || speed < 0)
return(EINVAL);
else
- term->c_ospeed = compatspcodes[speed];
+ term->c_ospeed = validspeed[speed];
term->c_cc[VERASE] = sg->sg_erase;
term->c_cc[VKILL] = sg->sg_kill;
tp->t_flags = (tp->t_flags&0xffff0000) | (sg->sg_flags&0xffff);
OpenPOWER on IntegriCloud