]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.0-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 22 Mar 2013 21:03:29 +0000 (14:03 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 22 Mar 2013 21:03:29 +0000 (14:03 -0700)
added patches:
sunsu-fix-panic-in-case-of-nonexistent-port-at-console-ttysy-cmdline-option.patch

queue-3.0/series
queue-3.0/sunsu-fix-panic-in-case-of-nonexistent-port-at-console-ttysy-cmdline-option.patch [new file with mode: 0644]

index d7691f3d817fc9d126ce23b66c0ffca7ef850f4f..a0fb649f41a182ff7f033107656a684076e1f8f1 100644 (file)
@@ -1 +1,2 @@
 revert-usb-ehci-don-t-check-dma-values-in-qh-overlays.patch
+sunsu-fix-panic-in-case-of-nonexistent-port-at-console-ttysy-cmdline-option.patch
diff --git a/queue-3.0/sunsu-fix-panic-in-case-of-nonexistent-port-at-console-ttysy-cmdline-option.patch b/queue-3.0/sunsu-fix-panic-in-case-of-nonexistent-port-at-console-ttysy-cmdline-option.patch
new file mode 100644 (file)
index 0000000..7f43aa9
--- /dev/null
@@ -0,0 +1,119 @@
+From 677256775929238ea4b842cc9d2ee4d0c29038f0 Mon Sep 17 00:00:00 2001
+From: Tkhai Kirill <tkhai@yandex.ru>
+Date: Sat, 23 Feb 2013 23:01:15 +0000
+Subject: sunsu: Fix panic in case of nonexistent port at "console=ttySY" cmdline option
+
+
+From: Tkhai Kirill <tkhai@yandex.ru>
+
+[ Upstream commit cb29529ea0030e60ef1bbbf8399a43d397a51526 ]
+
+If a machine has X (X < 4) sunsu ports and cmdline
+option "console=ttySY" is passed, where X < Y <= 4,
+than the following panic happens:
+
+Unable to handle kernel NULL pointer dereference
+TPC: <sunsu_console_setup+0x78/0xe0>
+RPC: <sunsu_console_setup+0x74/0xe0>
+I7: <register_console+0x378/0x3e0>
+Call Trace:
+ [0000000000453a38] register_console+0x378/0x3e0
+ [0000000000576fa0] uart_add_one_port+0x2e0/0x340
+ [000000000057af40] su_probe+0x160/0x2e0
+ [00000000005b8a4c] platform_drv_probe+0xc/0x20
+ [00000000005b6c2c] driver_probe_device+0x12c/0x220
+ [00000000005b6da8] __driver_attach+0x88/0xa0
+ [00000000005b4df4] bus_for_each_dev+0x54/0xa0
+ [00000000005b5a54] bus_add_driver+0x154/0x260
+ [00000000005b7190] driver_register+0x50/0x180
+ [00000000006d250c] sunsu_init+0x18c/0x1e0
+ [00000000006c2668] do_one_initcall+0xe8/0x160
+ [00000000006c282c] kernel_init_freeable+0x12c/0x1e0
+ [0000000000603764] kernel_init+0x4/0x100
+ [0000000000405f64] ret_from_syscall+0x1c/0x2c
+ [0000000000000000]           (null)
+
+1)Fix the panic;
+2)Increment registered port number every successful
+probe.
+
+Signed-off-by: Kirill Tkhai <tkhai@yandex.ru>
+CC: David Miller <davem@davemloft.net>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/tty/serial/sunsu.c |   21 +++++++++------------
+ 1 file changed, 9 insertions(+), 12 deletions(-)
+
+--- a/drivers/tty/serial/sunsu.c
++++ b/drivers/tty/serial/sunsu.c
+@@ -968,6 +968,7 @@ static struct uart_ops sunsu_pops = {
+ #define UART_NR       4
+ static struct uart_sunsu_port sunsu_ports[UART_NR];
++static int nr_inst; /* Number of already registered ports */
+ #ifdef CONFIG_SERIO
+@@ -1337,13 +1338,8 @@ static int __init sunsu_console_setup(st
+       printk("Console: ttyS%d (SU)\n",
+              (sunsu_reg.minor - 64) + co->index);
+-      /*
+-       * Check whether an invalid uart number has been specified, and
+-       * if so, search for the first available port that does have
+-       * console support.
+-       */
+-      if (co->index >= UART_NR)
+-              co->index = 0;
++      if (co->index > nr_inst)
++              return -ENODEV;
+       port = &sunsu_ports[co->index].port;
+       /*
+@@ -1408,7 +1404,6 @@ static enum su_type __devinit su_get_typ
+ static int __devinit su_probe(struct platform_device *op)
+ {
+-      static int inst;
+       struct device_node *dp = op->dev.of_node;
+       struct uart_sunsu_port *up;
+       struct resource *rp;
+@@ -1418,16 +1413,16 @@ static int __devinit su_probe(struct pla
+       type = su_get_type(dp);
+       if (type == SU_PORT_PORT) {
+-              if (inst >= UART_NR)
++              if (nr_inst >= UART_NR)
+                       return -EINVAL;
+-              up = &sunsu_ports[inst];
++              up = &sunsu_ports[nr_inst];
+       } else {
+               up = kzalloc(sizeof(*up), GFP_KERNEL);
+               if (!up)
+                       return -ENOMEM;
+       }
+-      up->port.line = inst;
++      up->port.line = nr_inst;
+       spin_lock_init(&up->port.lock);
+@@ -1461,6 +1456,8 @@ static int __devinit su_probe(struct pla
+               }
+               dev_set_drvdata(&op->dev, up);
++              nr_inst++;
++
+               return 0;
+       }
+@@ -1488,7 +1485,7 @@ static int __devinit su_probe(struct pla
+       dev_set_drvdata(&op->dev, up);
+-      inst++;
++      nr_inst++;
+       return 0;