From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [IPv6:2a0f:8001:1:32::40]) by lore.proxmox.com (Postfix) with ESMTPS id AE6351FF138 for ; Tue, 21 Jul 2026 14:43:08 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 207852144F; Tue, 21 Jul 2026 14:43:08 +0200 (CEST) Mime-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=UTF-8 Date: Tue, 21 Jul 2026 14:43:04 +0200 Message-Id: To: "Thomas Ellmenreich" , Subject: Re: [PATCH] fix #7828: avoid parsing absolute paths as volume ids From: "Daniel Kral" X-Mailer: aerc 0.21.0-147-g43ac7b685014-dirty References: <20260721122045.151215-1-t.ellmenreich@proxmox.com> In-Reply-To: <20260721122045.151215-1-t.ellmenreich@proxmox.com> X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1784637758656 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.222 Adjusted score from AWL reputation of From: address DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment (newer systems) RCVD_IN_DNSWL_LOW -0.7 Sender listed at https://www.dnswl.org/, low trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: 5AZF6NC4FCT6GRGFLWDAATLEJXCDMYJO X-Message-ID-Hash: 5AZF6NC4FCT6GRGFLWDAATLEJXCDMYJO X-MailFrom: d.kral@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Thanks for sending in a patch for this! On Tue Jul 21, 2026 at 2:20 PM CEST, Thomas Ellmenreich wrote: > Just like in the case of cdroms, absolute paths to storage drives can be > skipped when beeing marked as unused as they cannot be owned by the vm. > > Signed-off-by: Thomas Ellmenreich This should have a Fixes: 5b5c5768 ("display warnings for storage errors or if storage no long= er exists") as the added PVE::Storage::parse_volume_id() in that commit introduced this issue as it assumed that there would never be a absolute path storage here in $drive->{file}. > --- > I'm not 100% sure that I have understood the procedure of registering > unused drives correctly, but skipping this branch in the case of an > absolute path as 'volid' seems to be the correct action. > > Alternatively, placing the condition next to the `storage_config` check > could make sense, but would just achieve the same thing, as the > subsequent ownership check will never succeed with an absolute path. I think the placement is fine here. I think it would be nice to add a patch before this to add a helper subroutine PVE::QemuServer::Drive::drive_is_absolute_path() or something similar: sub drive_is_absolute_path { my ($drive) =3D @_; return $drive->{file} =3D~ m|^/|; } and replace all current checks =3D~ m|^/| and !~ m|^/| appropriately in qemu-server similar to the drive_is_cdrom() and drive_is_cloudinit() to make it easier to understand the special case here. > > src/PVE/QemuServer.pm | 8 +++++--- > 1 file changed, 5 insertions(+), 3 deletions(-) > > diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm > index 191ae549..782d2e7b 100644 > --- a/src/PVE/QemuServer.pm > +++ b/src/PVE/QemuServer.pm > @@ -1570,12 +1570,14 @@ sub vm_is_volid_owner { > sub vmconfig_register_unused_drive { > my ($storecfg, $vmid, $conf, $drive) =3D @_; > =20 > + my $volid =3D $drive->{file}; > + > if (drive_is_cloudinit($drive)) { > - eval { PVE::Storage::vdisk_free($storecfg, $drive->{file}) }; > + eval { PVE::Storage::vdisk_free($storecfg, $volid) }; It is best to do such changes in their own patch either preceding this or succeding this patch to make the fixing patch only about fixing the patch and nothing else ;). > warn $@ if $@; > delete $conf->{'special-sections'}->{cloudinit}; > - } elsif (!drive_is_cdrom($drive)) { > - my $volid =3D $drive->{file}; > + } elsif (!drive_is_cdrom($drive) && $volid !~ m|^/|) { > + > my ($storeid, undef) =3D PVE::Storage::parse_volume_id($volid); > if (PVE::Storage::storage_config($storecfg, $storeid, 1)) { > if (vm_is_volid_owner($storecfg, $vmid, $volid)) {