[pve-devel] [PATCH qemu-server 2/4] pbs: properly encode PBS password as UTF-8 when setting the environment variable

Fiona Ebner f.ebner at proxmox.com
Wed Oct 1 12:47:11 CEST 2025


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 contains multi-byte UTF-8 characters, 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 <f.ebner at proxmox.com>
---
 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 7d5ab718..a57eecd5 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;
@@ -6971,6 +6972,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 5b94c369..30a77ea9 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);
@@ -737,6 +738,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





More information about the pve-devel mailing list