diff options
author | Jason Wessel <jason.wessel@windriver.com> | 2008-09-26 10:36:42 -0500 |
---|---|---|
committer | Jason Wessel <jason.wessel@windriver.com> | 2008-09-26 10:36:42 -0500 |
commit | 0dca0fd2bfeb99738708d6c9117994ebf398e72c (patch) | |
tree | 115e01e2db84ebf7069c3c12c22c9d8934f4bc63 /drivers/char | |
parent | 703a1edcd1534468fc18f733c03bd91a65c8c6f0 (diff) | |
download | linux-0dca0fd2bfeb99738708d6c9117994ebf398e72c.tar.bz2 |
kgdboc,tty: Fix tty polling search to use name correctly
The tty_find_polling_driver() routine did not correctly check the base
part of the tty name. This can lead to kgdboc selecting an incorrect
driver, as well as accepting a completely invalid tty such as "echo
ffff0 > /sys/module/kgdboc/parameters/kgdboc".
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/tty_io.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index daeb8f766971..e4dce8709541 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c @@ -695,13 +695,23 @@ struct tty_driver *tty_find_polling_driver(char *name, int *line) { struct tty_driver *p, *res = NULL; int tty_line = 0; + int len; char *str; + for (str = name; *str; str++) + if ((*str >= '0' && *str <= '9') || *str == ',') + break; + if (!*str) + return NULL; + + len = str - name; + tty_line = simple_strtoul(str, &str, 10); + mutex_lock(&tty_mutex); /* Search through the tty devices to look for a match */ list_for_each_entry(p, &tty_drivers, tty_drivers) { - str = name + strlen(p->name); - tty_line = simple_strtoul(str, &str, 10); + if (strncmp(name, p->name, len) != 0) + continue; if (*str == ',') str++; if (*str == '\0') |