[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