mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 14:12:06 +00:00
hgafb: resource management fix
Release ports which are requested during detection which are not freed if there is no hga card. Otherwise there is a crash during cat /proc/ioports command. Signed-off-by: Krzysztof Helt <krzysztof.h1@wp.pl> Cc: <stable@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
69c5ddf58a
commit
630c270183
@ -303,20 +303,18 @@ static int __init hga_card_detect(void)
|
|||||||
writew(0x55aa, p); if (readw(p) == 0x55aa) count++;
|
writew(0x55aa, p); if (readw(p) == 0x55aa) count++;
|
||||||
writew(p_save, p);
|
writew(p_save, p);
|
||||||
|
|
||||||
if (count != 2) {
|
if (count != 2)
|
||||||
return 0;
|
goto error;
|
||||||
}
|
|
||||||
|
|
||||||
/* Ok, there is definitely a card registering at the correct
|
/* Ok, there is definitely a card registering at the correct
|
||||||
* memory location, so now we do an I/O port test.
|
* memory location, so now we do an I/O port test.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!test_hga_b(0x66, 0x0f)) { /* cursor low register */
|
if (!test_hga_b(0x66, 0x0f)) /* cursor low register */
|
||||||
return 0;
|
goto error;
|
||||||
}
|
|
||||||
if (!test_hga_b(0x99, 0x0f)) { /* cursor low register */
|
if (!test_hga_b(0x99, 0x0f)) /* cursor low register */
|
||||||
return 0;
|
goto error;
|
||||||
}
|
|
||||||
|
|
||||||
/* See if the card is a Hercules, by checking whether the vsync
|
/* See if the card is a Hercules, by checking whether the vsync
|
||||||
* bit of the status register is changing. This test lasts for
|
* bit of the status register is changing. This test lasts for
|
||||||
@ -331,7 +329,7 @@ static int __init hga_card_detect(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (p_save == q_save)
|
if (p_save == q_save)
|
||||||
return 0;
|
goto error;
|
||||||
|
|
||||||
switch (inb_p(HGA_STATUS_PORT) & 0x70) {
|
switch (inb_p(HGA_STATUS_PORT) & 0x70) {
|
||||||
case 0x10:
|
case 0x10:
|
||||||
@ -348,6 +346,12 @@ static int __init hga_card_detect(void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
error:
|
||||||
|
if (release_io_ports)
|
||||||
|
release_region(0x3b0, 12);
|
||||||
|
if (release_io_port)
|
||||||
|
release_region(0x3bf, 1);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user