ata: sata_mv: check for errors when parsing nr-ports from dt
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Tue, 29 Nov 2016 11:13:38 +0000 (12:13 +0100)
committerTejun Heo <tj@kernel.org>
Tue, 29 Nov 2016 16:35:06 +0000 (11:35 -0500)
If the nr-ports property is missing ata_host_alloc_pinfo is called with
n_ports = 0. This results in host->ports[0] = NULL which later makes
mv_init_host() oops when dereferencing this pointer.

Instead be a bit more cooperative and fail the probing with an error
message.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Tejun Heo <tj@kernel.org>
drivers/ata/sata_mv.c

index efc48bf89d5182a6b4b4150b522fabc2cc1844ee..823e938c9a7877a1cadefde9127d447832630061 100644 (file)
@@ -4090,7 +4090,20 @@ static int mv_platform_probe(struct platform_device *pdev)
 
        /* allocate host */
        if (pdev->dev.of_node) {
-               of_property_read_u32(pdev->dev.of_node, "nr-ports", &n_ports);
+               rc = of_property_read_u32(pdev->dev.of_node, "nr-ports",
+                                          &n_ports);
+               if (rc) {
+                       dev_err(&pdev->dev,
+                               "error parsing nr-ports property: %d\n", rc);
+                       return rc;
+               }
+
+               if (n_ports <= 0) {
+                       dev_err(&pdev->dev, "nr-ports must be positive: %d\n",
+                               n_ports);
+                       return -EINVAL;
+               }
+
                irq = irq_of_parse_and_map(pdev->dev.of_node, 0);
        } else {
                mv_platform_data = dev_get_platdata(&pdev->dev);