]> git.proxmox.com Git - pve-storage.git/commitdiff
fix #2099: escape systemd path names in mount unit
authorDominik Csapak <d.csapak@proxmox.com>
Wed, 20 Feb 2019 15:04:34 +0000 (16:04 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Wed, 20 Feb 2019 15:06:39 +0000 (16:06 +0100)
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@proxmox.com>
PVE/API2/Disks/Directory.pm

index 02cc72a88216fcac105b9f365083f341220ffd07..630d1cd12989427d94740beb070206e4b2d82cc7 100644 (file)
@@ -87,6 +87,22 @@ my $write_ini = sub {
     file_set_contents($filename, $content);
 };
 
     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 => '',
 __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) = @_;
 
        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);
 
            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 $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 {
            my $mountunitpath = "/etc/systemd/system/$mountunitname";
 
            PVE::Diskmanage::locked_disk_action(sub {