Commit 883f6451 authored by Antonino A. Daplas's avatar Antonino A. Daplas Committed by Linus Torvalds

[PATCH] i810fb: Fix oops if CONFIG_FB_I810_I2C is set to no

Reported by: Manuel Lauss <mano@roarinelk.homelinux.net>

compiled with CONFIG_FB_I810_I2C = n and CONFIG_FB_I810 = y
it oopses at boot in file drivers/video/i810/i810_main.c:1884

...
Unable to handle kernel NULL pointer dereference at virtual address 00000054
printing eip:
c02543c0
*pde = 00000000
Oops: 0000 [#1]
last sysfs file:
Modules linked in:
CPU:    0
EIP:    0060:[<c02543c0>]    Not tainted VLI
EFLAGS: 00010286   (2.6.13-mm2)
EIP is at i810fb_find_init_mode+0x53/0x93
eax: c113ddd4   ebx: c1194000   ecx: c04be2dd   edx: c1194000
esi: c1194008   edi: c113ddd4   ebp: c1194240   esp: c113ddcc
ds: 007b   es: 007b   ss: 0068

struct fb_monspecs *specs is initialized to NULL causing the oops.
Signed-off-by: default avatarAntonino Daplas <adaplas@pol.net>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 81d4903d
...@@ -950,7 +950,7 @@ static int i810_check_params(struct fb_var_screeninfo *var, ...@@ -950,7 +950,7 @@ static int i810_check_params(struct fb_var_screeninfo *var,
struct fb_info *info) struct fb_info *info)
{ {
struct i810fb_par *par = (struct i810fb_par *) info->par; struct i810fb_par *par = (struct i810fb_par *) info->par;
int line_length, vidmem, mode_valid = 0; int line_length, vidmem, mode_valid = 0, retval = 0;
u32 vyres = var->yres_virtual, vxres = var->xres_virtual; u32 vyres = var->yres_virtual, vxres = var->xres_virtual;
/* /*
* Memory limit * Memory limit
...@@ -1026,10 +1026,11 @@ static int i810_check_params(struct fb_var_screeninfo *var, ...@@ -1026,10 +1026,11 @@ static int i810_check_params(struct fb_var_screeninfo *var,
printk("i810fb: invalid video mode%s\n", printk("i810fb: invalid video mode%s\n",
default_sync ? "" : ". Specifying " default_sync ? "" : ". Specifying "
"vsyncN/hsyncN parameters may help"); "vsyncN/hsyncN parameters may help");
retval = -EINVAL;
} }
} }
return 0; return retval;
} }
/** /**
...@@ -1830,7 +1831,7 @@ static void __devinit i810fb_find_init_mode(struct fb_info *info) ...@@ -1830,7 +1831,7 @@ static void __devinit i810fb_find_init_mode(struct fb_info *info)
{ {
struct fb_videomode mode; struct fb_videomode mode;
struct fb_var_screeninfo var; struct fb_var_screeninfo var;
struct fb_monspecs *specs = NULL; struct fb_monspecs *specs = &info->monspecs;
int found = 0; int found = 0;
#ifdef CONFIG_FB_I810_I2C #ifdef CONFIG_FB_I810_I2C
int i; int i;
...@@ -1853,12 +1854,11 @@ static void __devinit i810fb_find_init_mode(struct fb_info *info) ...@@ -1853,12 +1854,11 @@ static void __devinit i810fb_find_init_mode(struct fb_info *info)
if (!err) if (!err)
printk("i810fb_init_pci: DDC probe successful\n"); printk("i810fb_init_pci: DDC probe successful\n");
fb_edid_to_monspecs(par->edid, &info->monspecs); fb_edid_to_monspecs(par->edid, specs);
if (info->monspecs.modedb == NULL) if (specs->modedb == NULL)
printk("i810fb_init_pci: Unable to get Mode Database\n"); printk("i810fb_init_pci: Unable to get Mode Database\n");
specs = &info->monspecs;
fb_videomode_to_modelist(specs->modedb, specs->modedb_len, fb_videomode_to_modelist(specs->modedb, specs->modedb_len,
&info->modelist); &info->modelist);
if (specs->modedb != NULL) { if (specs->modedb != NULL) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment