diff options
author | Alexey Khoroshilov <khoroshilov@ispras.ru> | 2016-05-02 22:22:27 -0400 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2016-05-10 04:58:29 -0400 |
commit | 524edf3877775c46e8b3ba56f9dd75d07914392c (patch) | |
tree | 8c4e34211850a802e8243842ab15971d455ce564 | |
parent | 18b6562c243f3a4be91a7a240090ebefccf39761 (diff) |
fbdev: fbmem: implement error handling in fbmem_init()
fbmem_init() ignores all errors, while fbmem_exit() does not
check if deallocating resources are valid.
Found by Linux Driver Verification project (linuxtesting.org).
Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
-rw-r--r-- | drivers/video/fbdev/core/fbmem.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c index 4e73b6f6b1c0..76c1ad96fb37 100644 --- a/drivers/video/fbdev/core/fbmem.c +++ b/drivers/video/fbdev/core/fbmem.c | |||
@@ -1854,17 +1854,31 @@ EXPORT_SYMBOL(fb_set_suspend); | |||
1854 | static int __init | 1854 | static int __init |
1855 | fbmem_init(void) | 1855 | fbmem_init(void) |
1856 | { | 1856 | { |
1857 | proc_create("fb", 0, NULL, &fb_proc_fops); | 1857 | int ret; |
1858 | |||
1859 | if (!proc_create("fb", 0, NULL, &fb_proc_fops)) | ||
1860 | return -ENOMEM; | ||
1858 | 1861 | ||
1859 | if (register_chrdev(FB_MAJOR,"fb",&fb_fops)) | 1862 | ret = register_chrdev(FB_MAJOR, "fb", &fb_fops); |
1863 | if (ret) { | ||
1860 | printk("unable to get major %d for fb devs\n", FB_MAJOR); | 1864 | printk("unable to get major %d for fb devs\n", FB_MAJOR); |
1865 | goto err_chrdev; | ||
1866 | } | ||
1861 | 1867 | ||
1862 | fb_class = class_create(THIS_MODULE, "graphics"); | 1868 | fb_class = class_create(THIS_MODULE, "graphics"); |
1863 | if (IS_ERR(fb_class)) { | 1869 | if (IS_ERR(fb_class)) { |
1864 | printk(KERN_WARNING "Unable to create fb class; errno = %ld\n", PTR_ERR(fb_class)); | 1870 | ret = PTR_ERR(fb_class); |
1871 | pr_warn("Unable to create fb class; errno = %d\n", ret); | ||
1865 | fb_class = NULL; | 1872 | fb_class = NULL; |
1873 | goto err_class; | ||
1866 | } | 1874 | } |
1867 | return 0; | 1875 | return 0; |
1876 | |||
1877 | err_class: | ||
1878 | unregister_chrdev(FB_MAJOR, "fb"); | ||
1879 | err_chrdev: | ||
1880 | remove_proc_entry("fb", NULL); | ||
1881 | return ret; | ||
1868 | } | 1882 | } |
1869 | 1883 | ||
1870 | #ifdef MODULE | 1884 | #ifdef MODULE |