diff options
author | Miguel Ojeda <maxextreme@gmail.com> | 2007-02-20 16:58:00 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-20 20:10:14 -0500 |
commit | 34173a4aad7a641e72b70f9927ca797746fbce69 (patch) | |
tree | e09d2fd33dc6e14d4b76210e471c47e8fed7b2a1 /drivers/auxdisplay/cfag12864b.c | |
parent | e627432c2948d500669a6c4522f22b66f5118d64 (diff) |
[PATCH] cfag12864b: fix crash when built-in and no parport present
The problem comes when ks0108/cfag12864b are built-in and no parallel port is
present. ks0108_init() is called first, as it should be, but fails to load
(as there is no parallel port to use).
After that, cfag12864b_init() gets called, without knowing anything about
ks0108 failed, and calls ks0108_writecontrol(), which dereferences an
uninitialized pointer.
Init order is OK, I think. The problem is how to stop cfag12864b_init() being
called if ks0108 failed to load. modprobe does it for us, but, how when
built-in?
Signed-off-by: Miguel Ojeda Sandonis <maxextreme@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/auxdisplay/cfag12864b.c')
-rw-r--r-- | drivers/auxdisplay/cfag12864b.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/auxdisplay/cfag12864b.c b/drivers/auxdisplay/cfag12864b.c index 889583dfc1a6..cb44cb4f6a47 100644 --- a/drivers/auxdisplay/cfag12864b.c +++ b/drivers/auxdisplay/cfag12864b.c | |||
@@ -312,6 +312,17 @@ EXPORT_SYMBOL_GPL(cfag12864b_disable); | |||
312 | EXPORT_SYMBOL_GPL(cfag12864b_isenabled); | 312 | EXPORT_SYMBOL_GPL(cfag12864b_isenabled); |
313 | 313 | ||
314 | /* | 314 | /* |
315 | * Is the module inited? | ||
316 | */ | ||
317 | |||
318 | static unsigned char cfag12864b_inited; | ||
319 | unsigned char cfag12864b_isinited(void) | ||
320 | { | ||
321 | return cfag12864b_inited; | ||
322 | } | ||
323 | EXPORT_SYMBOL_GPL(cfag12864b_isinited); | ||
324 | |||
325 | /* | ||
315 | * Module Init & Exit | 326 | * Module Init & Exit |
316 | */ | 327 | */ |
317 | 328 | ||
@@ -319,6 +330,13 @@ static int __init cfag12864b_init(void) | |||
319 | { | 330 | { |
320 | int ret = -EINVAL; | 331 | int ret = -EINVAL; |
321 | 332 | ||
333 | /* ks0108_init() must be called first */ | ||
334 | if (!ks0108_isinited()) { | ||
335 | printk(KERN_ERR CFAG12864B_NAME ": ERROR: " | ||
336 | "ks0108 is not initialized\n"); | ||
337 | goto none; | ||
338 | } | ||
339 | |||
322 | if (PAGE_SIZE < CFAG12864B_SIZE) { | 340 | if (PAGE_SIZE < CFAG12864B_SIZE) { |
323 | printk(KERN_ERR CFAG12864B_NAME ": ERROR: " | 341 | printk(KERN_ERR CFAG12864B_NAME ": ERROR: " |
324 | "page size (%i) < cfag12864b size (%i)\n", | 342 | "page size (%i) < cfag12864b size (%i)\n", |
@@ -354,6 +372,7 @@ static int __init cfag12864b_init(void) | |||
354 | cfag12864b_clear(); | 372 | cfag12864b_clear(); |
355 | cfag12864b_on(); | 373 | cfag12864b_on(); |
356 | 374 | ||
375 | cfag12864b_inited = 1; | ||
357 | return 0; | 376 | return 0; |
358 | 377 | ||
359 | cachealloced: | 378 | cachealloced: |