aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Hovold <johan@kernel.org>2017-04-26 06:30:04 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-05-18 10:43:55 -0400
commit11d4d32158eeaf36fe1073a4a260193d7a19ccf1 (patch)
treec3a2a3296511e46507a1431088bca3113e21cee5
parent1e948479b3d63e3ac0ecca13cbf4921c7d17c168 (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.c17
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
793error: 793err_deregister_tty_driver:
794 if (ehv_bc_driver) { 794 tty_unregister_driver(ehv_bc_driver);
795 tty_unregister_driver(ehv_bc_driver); 795err_put_tty_driver:
796 put_tty_driver(ehv_bc_driver); 796 put_tty_driver(ehv_bc_driver);
797 } 797err_free_bcs:
798
799 kfree(bcs); 798 kfree(bcs);
800 799
801 return ret; 800 return ret;