From 893ec6f2597c41dd048488534df1d2b6603639d8 Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Mon, 4 Jun 2018 10:39:34 +0200 Subject: [PATCH] tools: unbless errors in run_fork_with_timeout We cannot properly encode blessed objects as json, so instead, we should stringify them. This happened for instance if a VM's systemd scope wasn't cleaned up as we got an error as a Net::DBus::Error object causing a "malformed json string" error to appear instead of the actual message. Additionally, add a 'must_stringify' helper: The above error object implements a '""' operator for stringification (as all error should), but in theory that could die as well, in which case we just return a generic error string we'll hopefully never see... Signed-off-by: Wolfgang Bumiller --- src/PVE/Tools.pm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/PVE/Tools.pm b/src/PVE/Tools.pm index 1c5b502..53ac83f 100644 --- a/src/PVE/Tools.pm +++ b/src/PVE/Tools.pm @@ -904,6 +904,13 @@ sub next_spice_port { return next_unused_port(61000, 61099, $family, $address); } +sub must_stringify { + my ($value) = @_; + eval { $value = "$value" }; + return "error turning value into a string: $@" if $@; + return $value; +} + # sigkill after $timeout a $sub running in a fork if it can't write a pipe # the $sub has to return a single scalar sub run_fork_with_timeout { @@ -935,7 +942,7 @@ sub run_fork_with_timeout { $pipe_out->flush(); }; if (my $err = $@) { - print {$pipe_out} encode_json({ error => $err }); + print {$pipe_out} encode_json({ error => must_stringify($err) }); $pipe_out->flush(); POSIX::_exit(1); } -- 2.39.2