diff options
author | Johan Hovold <johan@kernel.org> | 2017-04-26 06:30:04 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-05-18 10:43:55 -0400 |
commit | 11d4d32158eeaf36fe1073a4a260193d7a19ccf1 (patch) | |
tree | c3a2a3296511e46507a1431088bca3113e21cee5 | |
parent | 1e948479b3d63e3ac0ecca13cbf4921c7d17c168 (diff) |
tty: ehv_bytechan: clean up init error handling
Straighten out the initcall error handling to avoid deregistering a
never-registered tty driver (something which would lead to a
NULL-pointer dereference) in the most unlikely event that driver
registration fails (e.g. we've run out of major numbers).
Signed-off-by: Johan Hovold <johan@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/tty/ehv_bytechan.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/drivers/tty/ehv_bytechan.c b/drivers/tty/ehv_bytechan.c index 7ac9bcdf1e61..61fe8d6fd24e 100644 --- a/drivers/tty/ehv_bytechan.c +++ b/drivers/tty/ehv_bytechan.c | |||
@@ -764,7 +764,7 @@ static int __init ehv_bc_init(void) | |||
764 | ehv_bc_driver = alloc_tty_driver(count); | 764 | ehv_bc_driver = alloc_tty_driver(count); |
765 | if (!ehv_bc_driver) { | 765 | if (!ehv_bc_driver) { |
766 | ret = -ENOMEM; | 766 | ret = -ENOMEM; |
767 | goto error; | 767 | goto err_free_bcs; |
768 | } | 768 | } |
769 | 769 | ||
770 | ehv_bc_driver->driver_name = "ehv-bc"; | 770 | ehv_bc_driver->driver_name = "ehv-bc"; |
@@ -778,24 +778,23 @@ static int __init ehv_bc_init(void) | |||
778 | ret = tty_register_driver(ehv_bc_driver); | 778 | ret = tty_register_driver(ehv_bc_driver); |
779 | if (ret) { | 779 | if (ret) { |
780 | pr_err("ehv-bc: could not register tty driver (ret=%i)\n", ret); | 780 | pr_err("ehv-bc: could not register tty driver (ret=%i)\n", ret); |
781 | goto error; | 781 | goto err_put_tty_driver; |
782 | } | 782 | } |
783 | 783 | ||
784 | ret = platform_driver_register(&ehv_bc_tty_driver); | 784 | ret = platform_driver_register(&ehv_bc_tty_driver); |
785 | if (ret) { | 785 | if (ret) { |
786 | pr_err("ehv-bc: could not register platform driver (ret=%i)\n", | 786 | pr_err("ehv-bc: could not register platform driver (ret=%i)\n", |
787 | ret); | 787 | ret); |
788 | goto error; | 788 | goto err_deregister_tty_driver; |
789 | } | 789 | } |
790 | 790 | ||
791 | return 0; | 791 | return 0; |
792 | 792 | ||
793 | error: | 793 | err_deregister_tty_driver: |
794 | if (ehv_bc_driver) { | 794 | tty_unregister_driver(ehv_bc_driver); |
795 | tty_unregister_driver(ehv_bc_driver); | 795 | err_put_tty_driver: |
796 | put_tty_driver(ehv_bc_driver); | 796 | put_tty_driver(ehv_bc_driver); |
797 | } | 797 | err_free_bcs: |
798 | |||
799 | kfree(bcs); | 798 | kfree(bcs); |
800 | 799 | ||
801 | return ret; | 800 | return ret; |