[pve-devel] [PATCH storage] fix #2099: escape systemd path names in mount unit

Dominik Csapak d.csapak at proxmox.com
Wed Feb 20 16:04:34 CET 2019


we only allow '-' '_' and '.' int storage-ids and names,
and we do not need to escape '_' and '.' (see man 5 systemd.unit)

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
 PVE/API2/Disks/Directory.pm | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/PVE/API2/Disks/Directory.pm b/PVE/API2/Disks/Directory.pm
index 02cc72a..630d1cd 100644
--- a/PVE/API2/Disks/Directory.pm
+++ b/PVE/API2/Disks/Directory.pm
@@ -87,6 +87,22 @@ my $write_ini = sub {
     file_set_contents($filename, $content);
 };
 
+sub systemd_escape {
+    my ($val) = @_;
+
+    $val =~ s/\-/\\x2d/g;
+
+    return $val;
+}
+
+sub systemd_unescape {
+    my ($val) = @_;
+
+    $val =~ s/\\x([a-fA-F0-9]{2})/chr(hex($1))/eg;
+
+    return $val;
+}
+
 __PACKAGE__->register_method ({
     name => 'index',
     path => '',
@@ -138,6 +154,7 @@ __PACKAGE__->register_method ({
 
 	dir_glob_foreach('/etc/systemd/system', '^mnt-pve-(.+)\.mount$', sub {
 	    my ($filename, $storid) = @_;
+	    $storid = systemd_unescape($storid);
 
 	    my $unitfile = "/etc/systemd/system/$filename";
 	    my $unit = $read_ini->($unitfile);
@@ -206,7 +223,7 @@ __PACKAGE__->register_method ({
 
 	my $worker = sub {
 	    my $path = "/mnt/pve/$name";
-	    my $mountunitname = "mnt-pve-$name.mount";
+	    my $mountunitname = "mnt-pve-".systemd_escape($name).".mount";
 	    my $mountunitpath = "/etc/systemd/system/$mountunitname";
 
 	    PVE::Diskmanage::locked_disk_action(sub {
-- 
2.11.0




More information about the pve-devel mailing list