The PBS password is saved as UTF-8 and decoded to Perl's internal
string representation upon reading from the password file. When the
password is not valid UTF-8 in Perl's internal representation, which
for example happens with a password like 'ääääöööö', backing up a
diskless VM would fail with:
> Error: error building client for repository XXX -
> PBS_PASSWORD contains bad characters

This is fixed by properly encoding the value for the PBS_PASSWORD
environment variable value again as UTF-8.

For example, this fixes uploading the log file after backup, as well
as extracting the configuration file from backup.

Signed-off-by: Fiona Ebner <[email protected]>
---

Changes in v2:
* Improve commit message - the ENV issues only happen when Perl's
  internal representation is not valid UTF-8 itself.

 src/PVE/Storage/PBSPlugin.pm | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/PVE/Storage/PBSPlugin.pm b/src/PVE/Storage/PBSPlugin.pm
index 17e285a..d81628d 100644
--- a/src/PVE/Storage/PBSPlugin.pm
+++ b/src/PVE/Storage/PBSPlugin.pm
@@ -5,7 +5,7 @@ package PVE::Storage::PBSPlugin;
 use strict;
 use warnings;
 
-use Encode qw(decode);
+use Encode qw(decode encode);
 use Fcntl qw(F_GETFD F_SETFD FD_CLOEXEC);
 use IO::File;
 use JSON;
@@ -327,7 +327,11 @@ my sub do_raw_client_cmd {
         push @$cmd, '--ns', $ns;
     }
 
-    local $ENV{PBS_PASSWORD} = pbs_get_password($scfg, $storeid);
+    my $password = pbs_get_password($scfg, $storeid);
+    # The password is saved as UTF-8 and is decoded upon reading. Need to 
re-encode when setting the
+    # environment variable.
+    $password = encode('UTF-8', $password, 1);
+    local $ENV{PBS_PASSWORD} = $password;
 
     local $ENV{PBS_FINGERPRINT} = $scfg->{fingerprint};
 
-- 
2.47.3




Reply via email to