]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
serdev: fix controller-allocation error handling
authorJohan Hovold <johan@kernel.org>
Thu, 12 Oct 2017 13:28:18 +0000 (15:28 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 23 Oct 2017 09:25:48 +0000 (11:25 +0200)
Reorder controller initialisation so that in the unlikely event that id
allocation fails, we don't end up releasing id 0 in the destructor.

Signed-off-by: Johan Hovold <johan@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serdev/core.c

index dde2ddc5967d749aa8eae55980cbe2e49d190bd7..4d662d1f47846b61e7d3367476ed0b50c3838215 100644 (file)
@@ -358,26 +358,31 @@ struct serdev_controller *serdev_controller_alloc(struct device *parent,
        if (!ctrl)
                return NULL;
 
-       device_initialize(&ctrl->dev);
-       ctrl->dev.type = &serdev_ctrl_type;
-       ctrl->dev.bus = &serdev_bus_type;
-       ctrl->dev.parent = parent;
-       ctrl->dev.of_node = parent->of_node;
-       serdev_controller_set_drvdata(ctrl, &ctrl[1]);
-
        id = ida_simple_get(&ctrl_ida, 0, 0, GFP_KERNEL);
        if (id < 0) {
                dev_err(parent,
                        "unable to allocate serdev controller identifier.\n");
-               serdev_controller_put(ctrl);
-               return NULL;
+               goto err_free;
        }
 
        ctrl->nr = id;
+
+       device_initialize(&ctrl->dev);
+       ctrl->dev.type = &serdev_ctrl_type;
+       ctrl->dev.bus = &serdev_bus_type;
+       ctrl->dev.parent = parent;
+       ctrl->dev.of_node = parent->of_node;
+       serdev_controller_set_drvdata(ctrl, &ctrl[1]);
+
        dev_set_name(&ctrl->dev, "serial%d", id);
 
        dev_dbg(&ctrl->dev, "allocated controller 0x%p id %d\n", ctrl, id);
        return ctrl;
+
+err_free:
+       kfree(ctrl);
+
+       return NULL;
 }
 EXPORT_SYMBOL_GPL(serdev_controller_alloc);