staging: dgap: unwind on error in dgap_tty_init()
authorDaeseok Youn <daeseok.youn@gmail.com>
Mon, 2 Jun 2014 05:07:46 +0000 (14:07 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 19 Jun 2014 22:21:47 +0000 (15:21 -0700)
If the kzalloc() fails for channels, it need to handle
that error. It should free channels which were already
allocated.

And also removes the call to dgap_tty_uninit() in
dgap_firmware_load().

Signed-off-by: Daeseok Youn <daeseok.youn@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/dgap/dgap.c

index fcfa061cb5e2ec8f08dd24bb37745b4a4fdfb1e8..8580f4bd229f1b8d4fc67ea6e7c098aba3baed03 100644 (file)
@@ -957,10 +957,8 @@ static int dgap_firmware_load(struct pci_dev *pdev, int card_type)
         * Do tty device initialization.
         */
        ret = dgap_tty_init(brd);
-       if (ret < 0) {
-               dgap_tty_uninit(brd);
+       if (ret < 0)
                return ret;
-       }
 
        ret = dgap_tty_register_ports(brd);
        if (ret)
@@ -1330,6 +1328,7 @@ static int dgap_tty_init(struct board_t *brd)
        struct channel_t *ch;
        struct bs_t __iomem *bs;
        struct cm_t __iomem *cm;
+       int ret;
 
        if (!brd)
                return -EIO;
@@ -1381,8 +1380,10 @@ static int dgap_tty_init(struct board_t *brd)
        for (i = 0; i < brd->nasync; i++) {
                brd->channels[i] =
                        kzalloc(sizeof(struct channel_t), GFP_KERNEL);
-               if (!brd->channels[i])
-                       return -ENOMEM;
+               if (!brd->channels[i]) {
+                       ret = -ENOMEM;
+                       goto free_chan;
+               }
        }
 
        ch = brd->channels[0];
@@ -1478,6 +1479,13 @@ static int dgap_tty_init(struct board_t *brd)
        }
 
        return 0;
+
+free_chan:
+       while (--i >= 0) {
+               kfree(brd->channels[i]);
+               brd->channels[i] = NULL;
+       }
+       return ret;
 }
 
 /*