char: moxa, prevent opening unavailable ports
authorDirk Eibach <[email protected]>
Thu, 18 Jun 2009 23:49:15 +0000 (16:49 -0700)
committerLinus Torvalds <[email protected]>
Fri, 19 Jun 2009 23:46:06 +0000 (16:46 -0700)
In moxa.c there are 32 minor numbers reserved for each device.  The number
of ports actually available per device is stored in
moxa_board_conf->numPorts.  This number is not considered in moxa_open().
Opening a port that is not available results in a kernel oops.  This patch
adds a test to moxa_open() that prevents opening unavailable ports.

[[email protected]: avoid multiple returns]
Signed-off-by: Dirk Eibach <[email protected]>
Signed-off-by: Jiri Slaby <[email protected]>
Cc: Alan Cox <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
drivers/char/moxa.c

index 65b6ff2442c6df4edfd839b37752ded8340df9c9..6799588b009976ca5d0efd98a065fd60f21d902d 100644 (file)
@@ -1189,6 +1189,11 @@ static int moxa_open(struct tty_struct *tty, struct file *filp)
                return -ENODEV;
        }
 
+       if (port % MAX_PORTS_PER_BOARD >= brd->numPorts) {
+               retval = -ENODEV;
+               goto out_unlock;
+       }
+
        ch = &brd->ports[port % MAX_PORTS_PER_BOARD];
        ch->port.count++;
        tty->driver_data = ch;
@@ -1213,8 +1218,8 @@ static int moxa_open(struct tty_struct *tty, struct file *filp)
                                moxa_close_port(tty);
        } else
                ch->port.flags |= ASYNC_NORMAL_ACTIVE;
+out_unlock:
        mutex_unlock(&moxa_openlock);
-
        return retval;
 }