aboutsummaryrefslogtreecommitdiff
path: root/hw/usb
diff options
context:
space:
mode:
authorDaniel P. Berrangé <berrange@redhat.com>2018-12-21 13:41:15 +0000
committerGerd Hoffmann <kraxel@redhat.com>2019-01-07 14:12:20 +0100
commit3fd2092fd11b9e4220a08eca0663cc59178a6c3f (patch)
tree1246055b0537deb1410eaa6bc362d6c68bc7331e /hw/usb
parente59dbbac0364344a3ad84c3497a98c56003d3fb8 (diff)
downloadqemu-3fd2092fd11b9e4220a08eca0663cc59178a6c3f.zip
qemu-3fd2092fd11b9e4220a08eca0663cc59178a6c3f.tar.gz
qemu-3fd2092fd11b9e4220a08eca0663cc59178a6c3f.tar.bz2
hw/usb: fix mistaken de-initialization of CCID state
In previous commit: commit 7dea29e4af17fc1d27478de9f8ea38144deac54a Author: Li Qiang <liq3ea@gmail.com> Date: Fri Oct 19 03:50:36 2018 -0700 hw: ccid-card-emulated: cleanup resource when realize in error path The emulated_realize method was changed so that it jumps to a cleanup label to de-initialize state upon error. This change failed to ensure the success path exited the method before this point though. So the mutexes are always destroyed even in normal operation. The result is as crashtastic as expected: $ qemu-system-x86_64 -usb -device usb-ccid,id=ccid0 -device ccid-card-emulated,backend=nss-emulated,id=smartcard0,bus=ccid0.0 qemu-system-x86_64: util/qemu-thread-posix.c:64: qemu_mutex_lock_impl: Assertion `mutex->initialized' failed. Aborted (core dumped) Fixes: 7dea29e4af1 Reported-by: Michael Tokarev <mjt@tls.msk.ru> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> Reviewed-by: Michael Tokarev <mjt@tls.msk.ru> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com> Message-id: 20181221134115.27973-1-berrange@redhat.com Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'hw/usb')
-rw-r--r--hw/usb/ccid-card-emulated.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/hw/usb/ccid-card-emulated.c b/hw/usb/ccid-card-emulated.c
index 25976ed..e0457d3 100644
--- a/hw/usb/ccid-card-emulated.c
+++ b/hw/usb/ccid-card-emulated.c
@@ -549,6 +549,8 @@ static void emulated_realize(CCIDCardState *base, Error **errp)
qemu_thread_create(&card->apdu_thread_id, "ccid/apdu", handle_apdu_thread,
card, QEMU_THREAD_JOINABLE);
+ return;
+
out2:
clean_event_notifier(card);
out1: