summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Wessel <jason.wessel@windriver.com>2008-09-26 10:36:42 -0500
committerJason Wessel <jason.wessel@windriver.com>2008-09-26 10:36:42 -0500
commit0dca0fd2bfeb99738708d6c9117994ebf398e72c (patch)
tree115e01e2db84ebf7069c3c12c22c9d8934f4bc63
parent703a1edcd1534468fc18f733c03bd91a65c8c6f0 (diff)
downloadlinux-0dca0fd2bfeb99738708d6c9117994ebf398e72c.tar.gz
linux-0dca0fd2bfeb99738708d6c9117994ebf398e72c.tar.bz2
linux-0dca0fd2bfeb99738708d6c9117994ebf398e72c.zip
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>
-rw-r--r--drivers/char/tty_io.c14
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')