tty: mxser: fix usage of opmode_ioaddr
authorMatwey V. Kornilov <matwey@sai.msu.ru>
Tue, 21 May 2013 09:57:37 +0000 (13:57 +0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 21 May 2013 17:26:05 +0000 (10:26 -0700)
mxser_port->opmode_ioaddr is initialized only for MOXA_MUST_MU860_HWID
chips, but no precautions have been undertaken to prevent reading and
writing to undefined port number.

Signed-off-by: Matwey V. Kornilov <matwey@sai.msu.ru>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/mxser.c

index 71d6eb2c93b1c6335ba123cc9ac3c17a2af0d805..f97b196693c658727608d8bcf3527874426cf9e4 100644 (file)
@@ -1618,8 +1618,12 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp)
                                if (ip->type == PORT_16550A)
                                        me->fifo[p] = 1;
 
-                               opmode = inb(ip->opmode_ioaddr)>>((p % 4) * 2);
-                               opmode &= OP_MODE_MASK;
+                               if (ip->board->chip_flag == MOXA_MUST_MU860_HWID) {
+                                       opmode = inb(ip->opmode_ioaddr)>>((p % 4) * 2);
+                                       opmode &= OP_MODE_MASK;
+                               } else {
+                                       opmode = RS232_MODE;
+                               }
                                me->iftype[p] = opmode;
                                mutex_unlock(&port->mutex);
                        }
@@ -1670,6 +1674,9 @@ static int mxser_ioctl(struct tty_struct *tty,
                return mxser_ioctl_special(cmd, argp);
 
        if (cmd == MOXA_SET_OP_MODE || cmd == MOXA_GET_OP_MODE) {
+               if (info->board->chip_flag != MOXA_MUST_MU860_HWID)
+                       return -EFAULT;
+
                int p;
                unsigned long opmode;
                static unsigned char ModeMask[] = { 0xfc, 0xf3, 0xcf, 0x3f };