staging: dgnc: clean up allocation of ->channels[i]
authorGiedrius Statkevičius <giedrius.statkevicius@gmail.com>
Thu, 9 Apr 2015 23:42:29 +0000 (02:42 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 8 May 2015 07:24:00 +0000 (09:24 +0200)
Check if kzalloc fails in dgnc_tty_init() and if it does then free all
previously allocated ->channels[i] and set them to NULL. This makes the code
less error/bug prone because instead of needing programmers attention to add
checks everywhere we do that in one place. Also, remove a bogus comment and
check in the same loop because ->channels[i] isn't allocated anywhere else.
Finally, remove a unnecessary check if ->channels[i] is NULL in the next loop
because it can't be.

Signed-off-by: Giedrius Statkevičius <giedrius.statkevicius@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/dgnc/dgnc_tty.c

index f954228a506440834d2ee63e046d8fe62f7d6e87..a8c88f829e424886b674ed6cc1783caadc284c71 100644 (file)
@@ -304,19 +304,15 @@ int dgnc_tty_init(struct dgnc_board *brd)
 
        brd->nasync = brd->maxports;
 
-       /*
-        * Allocate channel memory that might not have been allocated
-        * when the driver was first loaded.
-        */
        for (i = 0; i < brd->nasync; i++) {
-               if (!brd->channels[i]) {
-
-                       /*
-                        * Okay to malloc with GFP_KERNEL, we are not at
-                        * interrupt context, and there are no locks held.
-                        */
-                       brd->channels[i] = kzalloc(sizeof(*brd->channels[i]), GFP_KERNEL);
-               }
+               /*
+                * Okay to malloc with GFP_KERNEL, we are not at
+                * interrupt context, and there are no locks held.
+                */
+               brd->channels[i] = kzalloc(sizeof(*brd->channels[i]),
+                                          GFP_KERNEL);
+               if (!brd->channels[i])
+                       goto err_free_channels;
        }
 
        ch = brd->channels[0];
@@ -324,10 +320,6 @@ int dgnc_tty_init(struct dgnc_board *brd)
 
        /* Set up channel variables */
        for (i = 0; i < brd->nasync; i++, ch = brd->channels[i]) {
-
-               if (!brd->channels[i])
-                       continue;
-
                spin_lock_init(&ch->ch_lock);
 
                /* Store all our magic numbers */
@@ -375,6 +367,13 @@ int dgnc_tty_init(struct dgnc_board *brd)
        }
 
        return 0;
+
+err_free_channels:
+       for (i = i - 1; i >= 0; --i) {
+               kfree(brd->channels[i]);
+               brd->channels[i] = NULL;
+       }
+       return -ENOMEM;
 }