staging: dgap: implement error handling in dgap_tty_register()
PATCH v2 1/1 staging: dgap: implement error handling in dgap_tty_register()
Quoted 1 line
From
3acdda98e73a153a5fb32c2cd401d2dde1653b0aMon Sep 17 00:00:00 2001
From: Daeseok Youn <[email protected]>
Date: Fri, 25 Apr 2014 16:04:59 +0900
Subject: [PATCH] staging: dgap: implement error handling in dgap_tty_register()
- alloc_tty_driver() is deprecated so it is changed to tty_alloc_driver()
- Pointers which are allocated by alloc_tty_driver() and kzalloc() can be NULL so it need to check NULL for them.
- If one of those is failed, it need to add proper handler for avoiding memory leak.
- If both of drivers are registered normally, and
then set TRUE to dgap_major_serial{print}_registered. If one of drivers is failed to register, leave a default value as FALSE.
---
V2: rebased on staging-next branch
drivers/staging/dgap/dgap.c | 49 +++++++++++++++++++++++++++++++++--------- 1 files changed, 38 insertions(+), 11 deletions(-)
drivers/staging/dgap/dgap.c +38 -11
@@ -1212,7 +1212,9 @@ static int dgap_tty_register(struct board_t *brd) {int rc =0 ; - brd->serial_driver =alloc_tty_driver (MAXPORTS ); + brd->serial_driver =tty_alloc_driver (MAXPORTS ,0 ); +if (IS_ERR (brd->serial_driver)) +return PTR_ERR (brd->serial_driver);snprintf (brd->serial_name,MAXTTYNAMELEN ,"tty_dgap_%d_" , brd->boardnum);
@@ -1231,8 +1233,10 @@ static int dgap_tty_register(struct board_t *brd)/* The kernel wants space to store pointers to tty_structs */ brd->serial_driver->ttys =kzalloc (MAXPORTS *sizeof (struct tty_struct *),GFP_KERNEL ); -if (!brd->serial_driver->ttys) -return -ENOMEM ; +if (!brd->serial_driver->ttys) { + rc = -ENOMEM ; + goto free_serial_drv; + }/* * Entry points for driver. Called by the kernel from
@@ -1245,7 +1249,11 @@ static int dgap_tty_register(struct board_t *brd)* again, separately so we don't get the LD confused about what major * we are when we get into the dgap_tty_open() routine. */ - brd->print_driver =alloc_tty_driver (MAXPORTS ); + brd->print_driver =tty_alloc_driver (MAXPORTS ,0 ); +if (IS_ERR (brd->print_driver)) { + rc =PTR_ERR (brd->print_driver); + goto free_serial_ttys; + }snprintf (brd->print_name,MAXTTYNAMELEN ,"pr_dgap_%d_" , brd->boardnum);
@@ -1264,8 +1272,10 @@ static int dgap_tty_register(struct board_t *brd)/* The kernel wants space to store pointers to tty_structs */ brd->print_driver->ttys =kzalloc (MAXPORTS *sizeof (struct tty_struct *),GFP_KERNEL ); -if (!brd->print_driver->ttys) -return -ENOMEM ; +if (!brd->print_driver->ttys) { + rc = -ENOMEM ; + goto free_print_drv; + }/* * Entry points for driver. Called by the kernel from
@@ -1276,20 +1286,37 @@ static int dgap_tty_register(struct board_t *brd)/* Register tty devices */ rc =tty_register_driver (brd->serial_driver);if (rc <0 ) -return rc; - brd->dgap_major_serial_registered = TRUE; - dgap_boards_by_major[brd->serial_driver->major] = brd; - brd->dgap_serial_major = brd->serial_driver->major; + goto free_print_ttys;/* Register Transparent Print devices */ rc =tty_register_driver (brd->print_driver);if (rc <0 ) -return rc; + goto unregister_serial_drv; + + brd->dgap_major_serial_registered = TRUE; + dgap_boards_by_major[brd->serial_driver->major] = brd; + brd->dgap_serial_major = brd->serial_driver->major; + brd->dgap_major_transparent_print_registered = TRUE; dgap_boards_by_major[brd->print_driver->major] = brd; brd->dgap_transparent_print_major = brd->print_driver->major;return rc; + +unregister_serial_drv: +tty_unregister_driver (brd->serial_driver); +free_print_ttys: +kfree (brd->print_driver->ttys); + brd->print_driver->ttys =NULL ; +free_print_drv: +put_tty_driver (brd->print_driver); +free_serial_ttys: +kfree (brd->serial_driver->ttys); + brd->serial_driver->ttys =NULL ; +free_serial_drv: +put_tty_driver (brd->serial_driver); + +return rc; }/*
Signature · 1 line
1.7.1