This patch changes error handling to the
tty_driver allocations in dgap_tty_register.

Before, it didn't handle the possibility of an
alloc_tty_driver failure. This patch makes
dgap_register_driver return -ENOMEM if that fails.

This patch also adds handling to the possibility that
the brd->SerialDriver->ttys or brd->PrintDriver->ttys
allocation will fail. It now calls put_tty_driver on
that driver after it fails and returns -ENOMEM.

Signed-off-by: Lidza Louina <lidza.lou...@gmail.com>
---
 drivers/staging/dgap/dgap_tty.c | 26 ++++++++++++++++++--------
 1 file changed, 18 insertions(+), 8 deletions(-)

diff --git a/drivers/staging/dgap/dgap_tty.c b/drivers/staging/dgap/dgap_tty.c
index 59fda2e..3e12ddb 100644
--- a/drivers/staging/dgap/dgap_tty.c
+++ b/drivers/staging/dgap/dgap_tty.c
@@ -220,6 +220,8 @@ int dgap_tty_register(struct board_t *brd)
        DPR_INIT(("tty_register start"));
 
        brd->SerialDriver = alloc_tty_driver(MAXPORTS);
+       if (!brd->SerialDriver)
+               return -ENOMEM;
 
        snprintf(brd->SerialName, MAXTTYNAMELEN, "tty_dgap_%d_", brd->boardnum);
        brd->SerialDriver->name = brd->SerialName;
@@ -234,9 +236,10 @@ int dgap_tty_register(struct board_t *brd)
 
        /* The kernel wants space to store pointers to tty_structs */
        brd->SerialDriver->ttys = dgap_driver_kzmalloc(MAXPORTS * sizeof(struct 
tty_struct *), GFP_KERNEL);
-       if (!brd->SerialDriver->ttys)
-               return(-ENOMEM);
-
+       if (!brd->SerialDriver->ttys){
+               rc = -ENOMEM;
+               goto err_put_tty_serial;        
+       }
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28)
        brd->SerialDriver->refcount = brd->TtyRefCnt;
 #endif
@@ -253,6 +256,8 @@ int dgap_tty_register(struct board_t *brd)
         * we are when we get into the dgap_tty_open() routine.
         */
        brd->PrintDriver = alloc_tty_driver(MAXPORTS);
+       if (!brd->PrintDriver)
+               return -ENOMEM;
 
        snprintf(brd->PrintName, MAXTTYNAMELEN, "pr_dgap_%d_", brd->boardnum);
        brd->PrintDriver->name = brd->PrintName;
@@ -267,9 +272,10 @@ int dgap_tty_register(struct board_t *brd)
 
        /* The kernel wants space to store pointers to tty_structs */
        brd->PrintDriver->ttys = dgap_driver_kzmalloc(MAXPORTS * sizeof(struct 
tty_struct *), GFP_KERNEL);
-       if (!brd->PrintDriver->ttys)
-               return(-ENOMEM);
-
+       if (!brd->PrintDriver->ttys){
+               rc = -ENOMEM;
+               goto err_put_tty_print;
+       }
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28)
        brd->PrintDriver->refcount = brd->TtyRefCnt;
 #endif
@@ -285,7 +291,7 @@ int dgap_tty_register(struct board_t *brd)
                rc = tty_register_driver(brd->SerialDriver);
                if (rc < 0) {
                        APR(("Can't register tty device (%d)\n", rc));
-                       return(rc);
+                       goto err_put_tty_serial;
                }
                brd->dgap_Major_Serial_Registered = TRUE;
                dgap_BoardsByMajor[brd->SerialDriver->major] = brd;
@@ -297,7 +303,7 @@ int dgap_tty_register(struct board_t *brd)
                rc = tty_register_driver(brd->PrintDriver);
                if (rc < 0) {
                        APR(("Can't register Transparent Print device (%d)\n", 
rc));
-                       return(rc);
+                       goto err_put_tty_print;
                }
                brd->dgap_Major_TransparentPrint_Registered = TRUE;
                dgap_BoardsByMajor[brd->PrintDriver->major] = brd;
@@ -307,6 +313,10 @@ int dgap_tty_register(struct board_t *brd)
        DPR_INIT(("DGAP REGISTER TTY: MAJORS: %d %d\n", 
brd->SerialDriver->major,
                brd->PrintDriver->major));
 
+err_put_tty_serial:
+       put_tty_driver(brd->SerialDriver);
+err_put_tty_print:
+       put_tty_driver(brd->PrintDriver);
        return (rc);
 }
 
-- 
1.8.1.2

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to