From 356bf55e98b9e5d6abbd9a382abfe4e495f72314 Mon Sep 17 00:00:00 2001 From: Roman Bogorodskiy Date: Mon, 10 Mar 2014 14:51:32 +0400 Subject: [PATCH] Fix locking in virsh console vshRunConsole() uses virCondWait() which is a wrapper around pthread_cond_wait(). On FreeBSD, pthread_cond_wait needs mutex to be locked, otherwise it immediately fails with EPERM. On Linux, the behaviour in this case is undefined. So lock the mutex before calling virCondWait(). --- tools/virsh-console.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/virsh-console.c b/tools/virsh-console.c index 9c39ac42d2..c664a3a6cd 100644 --- a/tools/virsh-console.c +++ b/tools/virsh-console.c @@ -356,6 +356,8 @@ vshRunConsole(vshControl *ctl, if (virCondInit(&con->cond) < 0 || virMutexInit(&con->lock) < 0) goto cleanup; + virMutexLock(&con->lock); + con->stdinWatch = virEventAddHandle(STDIN_FILENO, VIR_EVENT_HANDLE_READABLE, virConsoleEventOnStdin, @@ -375,11 +377,14 @@ vshRunConsole(vshControl *ctl, while (!con->quit) { if (virCondWait(&con->cond, &con->lock) < 0) { + virMutexUnlock(&con->lock); VIR_ERROR(_("unable to wait on console condition")); goto cleanup; } } + virMutexUnlock(&con->lock); + ret = 0; cleanup: