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
and restoring would fail with:
> restore failed: invalid utf-8 sequence of 1 bytes from index 0

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

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/QemuServer.pm        | 4 ++++
 src/PVE/VZDump/QemuServer.pm | 4 ++++
 2 files changed, 8 insertions(+)

diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm
index 38f34f80..dbc5e5ea 100644
--- a/src/PVE/QemuServer.pm
+++ b/src/PVE/QemuServer.pm
@@ -5,6 +5,7 @@ use warnings;
 
 use Cwd 'abs_path';
 use Digest::SHA;
+use Encode qw(encode);
 use Fcntl ':flock';
 use Fcntl;
 use File::Basename;
@@ -6880,6 +6881,9 @@ sub restore_proxmox_backup_archive {
 
     # This is only used for `pbs-restore` and the QEMU PBS driver 
(live-restore)
     my $password = PVE::Storage::PBSPlugin::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} = $fingerprint if defined($fingerprint);
 
diff --git a/src/PVE/VZDump/QemuServer.pm b/src/PVE/VZDump/QemuServer.pm
index 55fb6dc4..afac1496 100644
--- a/src/PVE/VZDump/QemuServer.pm
+++ b/src/PVE/VZDump/QemuServer.pm
@@ -3,6 +3,7 @@ package PVE::VZDump::QemuServer;
 use strict;
 use warnings;
 
+use Encode qw(encode);
 use Fcntl qw(:mode);
 use File::Basename;
 use File::Path qw(make_path remove_tree);
@@ -738,6 +739,9 @@ sub archive_pbs {
     if (!$diskcount) {
         $self->loginfo("backup contains no disks");
 
+        # 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} = $fingerprint if defined($fingerprint);
         my $cmd = [
-- 
2.47.3




Reply via email to