From f85951dc82004040d877c5651ef81762f53e29eb Mon Sep 17 00:00:00 2001 From: Stefan Reiter Date: Thu, 14 Oct 2021 11:28:49 +0200 Subject: [PATCH] swtpm: wait for pidfile swtpm may take a little bit to daemonize, so the pidfile might not be available right after run_command. Causes an ugly warning about using an undefined value in a match, so wait up to 5s for it to appear. Note that in testing this loop only ever got to the first or second iteration, so I believe the timeout duration should be more than enough. Also add a missing 'usleep' import, 'usleep' was used before but never imported, apparently the other case never got triggered... Signed-off-by: Stefan Reiter --- PVE/QemuServer.pm | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index 59944c3b..b0d2fa06 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -22,7 +22,7 @@ use JSON; use MIME::Base64; use POSIX; use Storable qw(dclone); -use Time::HiRes qw(gettimeofday); +use Time::HiRes qw(gettimeofday usleep); use URI::Escape; use UUID; @@ -3058,6 +3058,14 @@ sub start_swtpm { push @$emulator_cmd, "--tpm2" if $tpm->{version} eq 'v2.0'; run_command($emulator_cmd, outfunc => sub { print $1; }); + # swtpm may take a bit to start before daemonizing, wait up to 5s for pid + my $tries = 100; + while (! -e $paths->{pid}) { + usleep(50000); + die "failed to start swtpm: pid file '$paths->{pid}' wasn't created.\n" + if --$tries == 0; + } + # return untainted PID of swtpm daemon so it can be killed on error file_read_firstline($paths->{pid}) =~ m/(\d+)/; return $1;