diff options
author | Brian King <brking@linux.vnet.ibm.com> | 2008-05-14 10:48:25 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2008-05-22 06:03:31 -0400 |
commit | 7fb1c2ac8ecaf0883f2fcb38dfc9ec2d15cee11d (patch) | |
tree | 738eaa1d97db953e3f60864e2df9bbfc5e0580f2 | |
parent | 74ef5c5025fed5ad6a1cbdfb5c2e831acdbbd2fe (diff) |
ehea: Fix use after free on reboot
Fixes the following use after free oops:
ehea: Reboot: freeing all eHEA resources
Unable to handle kernel paging request for data at address 0x6b6b6b6b6b6b6c5b
Faulting instruction address: 0xd000000000354488
cpu 0x0: Vector: 300 (Data Access) at [c00000002ec6f310]
pc: d000000000354488: .ehea_shutdown_single_port+0x50/0x78 [ehea]
lr: d00000000035447c: .ehea_shutdown_single_port+0x44/0x78 [ehea]
sp: c00000002ec6f590
msr: 8000000000009032
dar: 6b6b6b6b6b6b6c5b
dsisr: 40000000
current = 0xc0000000281412e0
paca = 0xc0000000006df300
pid = 10930, comm = reboot
enter ? for help
[c00000002ec6f590] d00000000035d64c .ehea_remove+0x44/0x124 [ehea] (unreliable)
[c00000002ec6f630] c000000000319f88 .of_platform_device_remove+0x40/0x58
[c00000002ec6f6a0] c000000000291018 .__device_release_driver+0xb0/0xf0
[c00000002ec6f730] c000000000291120 .driver_detach+0xc8/0xfc
[c00000002ec6f7c0] c00000000028fe24 .bus_remove_driver+0xb4/0x114
[c00000002ec6f850] c000000000291768 .driver_unregister+0x54/0x74
[c00000002ec6f8e0] c00000000031a0c8 .of_unregister_driver+0x14/0x28
[c00000002ec6f950] c000000000023ba0 .ibmebus_unregister_driver+0x10/0x24
[c00000002ec6f9c0] d000000000354180 .ehea_reboot_notifier+0x30/0x4c [ehea]
[c00000002ec6fa40] c0000000003c95a8 .notifier_call_chain+0x5c/0xcc
[c00000002ec6fae0] c000000000082cd4 .__blocking_notifier_call_chain+0x70/0xb0
[c00000002ec6fb90] c000000000075cf8 .kernel_restart_prepare+0x24/0x58
[c00000002ec6fc10] c000000000075f0c .kernel_restart+0x20/0x6c
[c00000002ec6fc90] c000000000078674 .sys_reboot+0x1d4/0x290
[c00000002ec6fe30] c0000000000086ac syscall_exit+0x0/0x40
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
-rw-r--r-- | drivers/net/ehea/ehea_main.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c index d1b6d4e7495d..8645224da1cf 100644 --- a/drivers/net/ehea/ehea_main.c +++ b/drivers/net/ehea/ehea_main.c | |||
@@ -3178,11 +3178,12 @@ out_err: | |||
3178 | 3178 | ||
3179 | static void ehea_shutdown_single_port(struct ehea_port *port) | 3179 | static void ehea_shutdown_single_port(struct ehea_port *port) |
3180 | { | 3180 | { |
3181 | struct ehea_adapter *adapter = port->adapter; | ||
3181 | unregister_netdev(port->netdev); | 3182 | unregister_netdev(port->netdev); |
3182 | ehea_unregister_port(port); | 3183 | ehea_unregister_port(port); |
3183 | kfree(port->mc_list); | 3184 | kfree(port->mc_list); |
3184 | free_netdev(port->netdev); | 3185 | free_netdev(port->netdev); |
3185 | port->adapter->active_ports--; | 3186 | adapter->active_ports--; |
3186 | } | 3187 | } |
3187 | 3188 | ||
3188 | static int ehea_setup_ports(struct ehea_adapter *adapter) | 3189 | static int ehea_setup_ports(struct ehea_adapter *adapter) |