efifb: prevent null-deref when iterating dmi_list
authorJames Bates <james.h.bates@gmail.com>
Wed, 2 Oct 2013 16:43:39 +0000 (18:43 +0200)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Tue, 29 Oct 2013 10:41:46 +0000 (12:41 +0200)
The dmi_list array is initialized using gnu designated initializers, and
therefore may contain fewer explicitly defined entries as there are
elements in it. This is because the enum above with M_xyz constants
contains more items than the designated initializer. Those elements not
explicitly initialized are implicitly set to 0.

Now efifb_setup() loops through all these array elements, and performs
a strcmp on each item. For non explicitly initialized elements this will
be a null pointer:

This patch swaps the check order in the if statement, thus checks first
whether dmi_list[i].base is null.

Signed-off-by: James Bates <james.h.bates@gmail.com>
Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
drivers/video/efifb.c

index 7f9ff75..fcb9500 100644 (file)
@@ -108,8 +108,8 @@ static int efifb_setup(char *options)
                        if (!*this_opt) continue;
 
                        for (i = 0; i < M_UNKNOWN; i++) {
-                               if (!strcmp(this_opt, efifb_dmi_list[i].optname) &&
-                                   efifb_dmi_list[i].base != 0) {
+                               if (efifb_dmi_list[i].base != 0 &&
+                                   !strcmp(this_opt, efifb_dmi_list[i].optname)) {
                                        screen_info.lfb_base = efifb_dmi_list[i].base;
                                        screen_info.lfb_linelength = efifb_dmi_list[i].stride;
                                        screen_info.lfb_width = efifb_dmi_list[i].width;