diff options
author | Vasiliy Kulikov <segooon@gmail.com> | 2010-09-05 14:32:22 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-10-22 13:20:03 -0400 |
commit | b670bde0b2497966d76154cfb9706c38cf8348f9 (patch) | |
tree | 0e85f57a2f6b806ec7a79addfc00a23a8d3c9b3c | |
parent | df480518a688f0d28f7e7de69abe6a441d1c2c64 (diff) |
tty_io: check return code of tty_register_device
Function tty_register_device may return ERR_PTR(...). Check for it.
Signed-off-by: Vasiliy Kulikov <segooon@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/char/tty_io.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index d6c659f2f659..e185db36f8ad 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
@@ -3004,6 +3004,7 @@ int tty_register_driver(struct tty_driver *driver) | |||
3004 | int i; | 3004 | int i; |
3005 | dev_t dev; | 3005 | dev_t dev; |
3006 | void **p = NULL; | 3006 | void **p = NULL; |
3007 | struct device *d; | ||
3007 | 3008 | ||
3008 | if (!(driver->flags & TTY_DRIVER_DEVPTS_MEM) && driver->num) { | 3009 | if (!(driver->flags & TTY_DRIVER_DEVPTS_MEM) && driver->num) { |
3009 | p = kzalloc(driver->num * 2 * sizeof(void *), GFP_KERNEL); | 3010 | p = kzalloc(driver->num * 2 * sizeof(void *), GFP_KERNEL); |
@@ -3051,12 +3052,31 @@ int tty_register_driver(struct tty_driver *driver) | |||
3051 | mutex_unlock(&tty_mutex); | 3052 | mutex_unlock(&tty_mutex); |
3052 | 3053 | ||
3053 | if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV)) { | 3054 | if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV)) { |
3054 | for (i = 0; i < driver->num; i++) | 3055 | for (i = 0; i < driver->num; i++) { |
3055 | tty_register_device(driver, i, NULL); | 3056 | d = tty_register_device(driver, i, NULL); |
3057 | if (IS_ERR(d)) { | ||
3058 | error = PTR_ERR(d); | ||
3059 | goto err; | ||
3060 | } | ||
3061 | } | ||
3056 | } | 3062 | } |
3057 | proc_tty_register_driver(driver); | 3063 | proc_tty_register_driver(driver); |
3058 | driver->flags |= TTY_DRIVER_INSTALLED; | 3064 | driver->flags |= TTY_DRIVER_INSTALLED; |
3059 | return 0; | 3065 | return 0; |
3066 | |||
3067 | err: | ||
3068 | for (i--; i >= 0; i--) | ||
3069 | tty_unregister_device(driver, i); | ||
3070 | |||
3071 | mutex_lock(&tty_mutex); | ||
3072 | list_del(&driver->tty_drivers); | ||
3073 | mutex_unlock(&tty_mutex); | ||
3074 | |||
3075 | unregister_chrdev_region(dev, driver->num); | ||
3076 | driver->ttys = NULL; | ||
3077 | driver->termios = NULL; | ||
3078 | kfree(p); | ||
3079 | return error; | ||
3060 | } | 3080 | } |
3061 | 3081 | ||
3062 | EXPORT_SYMBOL(tty_register_driver); | 3082 | EXPORT_SYMBOL(tty_register_driver); |