linux-3.0.x for AP-SH4A-0A Board
Revision | efa73f1334e339902993bb4894da47242f0c4173 (tree) |
---|---|
Time | 2011-08-05 13:58:31 |
Author | Tobias Klauser <tklauser@dist...> |
Commiter | Greg Kroah-Hartman |
Staging: usbip: vhci-hcd: Do not kill already dead RX/TX kthread
commit 8547d4cc2b616e4f1dafebe2c673fc986422b506 upstream.
When unbinding a device on the host which was still attached on the
client, I got a NULL pointer dereference on the client. This turned out
to be due to kthread_stop() being called on an already dead kthread.
Here is how I was able to reproduce the problem:
This patch fixes the problem by checking the kthread before attempting
to kill it, as it is done on the opposite side in
stub_shutdown_connection().
Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
@@ -846,9 +846,9 @@ static void vhci_shutdown_connection(struct usbip_device *ud) | ||
846 | 846 | } |
847 | 847 | |
848 | 848 | /* kill threads related to this sdev, if v.c. exists */ |
849 | - if (vdev->ud.tcp_rx) | |
849 | + if (vdev->ud.tcp_rx && !task_is_dead(vdev->ud.tcp_rx)) | |
850 | 850 | kthread_stop(vdev->ud.tcp_rx); |
851 | - if (vdev->ud.tcp_tx) | |
851 | + if (vdev->ud.tcp_tx && !task_is_dead(vdev->ud.tcp_tx)) | |
852 | 852 | kthread_stop(vdev->ud.tcp_tx); |
853 | 853 | |
854 | 854 | pr_info("stop threads\n"); |