From 43e04c681e919df8bc6e8993c39314d6079279da Mon Sep 17 00:00:00 2001 From: Dominik Csapak Date: Wed, 20 Feb 2019 16:04:34 +0100 Subject: [PATCH] fix #2099: escape systemd path names in mount unit 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 --- 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 {