OSDN Git Service

greybus: uart: fix the clean up while uart initiates connection unsucessfully
authorPhong Tran <tranmanphong@gmail.com>
Wed, 10 Jun 2015 14:03:17 +0000 (21:03 +0700)
committerGreg Kroah-Hartman <gregkh@google.com>
Thu, 11 Jun 2015 22:57:44 +0000 (15:57 -0700)
There is lack of unregister and free the tty driver.
This patch fixes it.

Signed-off-by: Phong Tran <tranmanphong@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/uart.c

index 7e94632..2092870 100644 (file)
@@ -586,20 +586,22 @@ static int gb_uart_connection_init(struct gb_connection *connection)
        }
 
        gb_tty = kzalloc(sizeof(*gb_tty), GFP_KERNEL);
-       if (!gb_tty)
-               return -ENOMEM;
+       if (!gb_tty) {
+               retval = -ENOMEM;
+               goto error_alloc;
+       }
 
        gb_tty->buffer_payload_max =
                gb_operation_get_payload_size_max(connection);
        if (!gb_tty->buffer_payload_max) {
-               kfree(gb_tty);
-               return -EINVAL;
+               retval = -EINVAL;
+               goto error_payload;
        }
 
        gb_tty->buffer = kzalloc(gb_tty->buffer_payload_max, GFP_KERNEL);
        if (!gb_tty->buffer) {
-               kfree(gb_tty);
-               return -ENOMEM;
+               retval = -ENOMEM;
+               goto error_payload;
        }
 
        gb_tty->connection = connection;
@@ -654,7 +656,11 @@ error:
 error_version:
        connection->private = NULL;
        kfree(gb_tty->buffer);
+error_payload:
        kfree(gb_tty);
+error_alloc:
+       if (atomic_dec_return(&reference_count) == 0)
+               gb_tty_exit();
        return retval;
 }