]> git.proxmox.com Git - pve-manager.git/commitdiff
vzdump: verify parameters: properly verify notes-template
authorFabian Ebner <f.ebner@proxmox.com>
Mon, 9 May 2022 10:34:08 +0000 (12:34 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Thu, 12 May 2022 15:17:48 +0000 (17:17 +0200)
instead of just checking for a newline, do a full check already.

Also do the check at the beginning of generate_notes() for consistency
and remove the check after expansion to avoid failing late for things
like '{{cl{{node}}er}}' (which can even expand to a valid variable
making the error even more confusing).

Co-developed-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
PVE/VZDump.pm

index edcab6966f1a920a6589a3f8f044c2c57717e933..0dbf8928054b95910eb410fda879c7f1d58d1ab3 100644 (file)
@@ -70,9 +70,32 @@ sub run_command {
     PVE::Tools::run_command($cmdstr, %param, logfunc => $logfunc);
 }
 
+my $verify_notes_template = sub {
+    my ($template) = @_;
+
+    die "contains a line feed\n" if $template =~ /\n/;
+
+    my @problematic = ();
+    while ($template =~ /\\(.)/g) {
+       my $char = $1;
+       push @problematic, "escape sequence '\\$char' at char " . (pos($template) - 2)
+           if $char !~ /^[n\\]$/;
+    }
+
+    while ($template =~ /\{\{([^\s{}]+)\}\}/g) {
+       my $var = $1;
+       push @problematic, "variable '$var' at char " . (pos($template) - length($var))
+           if $var !~ /^(cluster|guestname|node|vmid)$/;
+    }
+
+    die "found unknown: " . join(', ', @problematic) . "\n" if scalar(@problematic);
+};
+
 my $generate_notes = sub {
     my ($notes_template, $task) = @_;
 
+    $verify_notes_template->($notes_template);
+
     my $info = {
        cluster => PVE::Cluster::get_clinfo()->{cluster}->{name},
        guestname => $task->{hostname},
@@ -92,8 +115,6 @@ my $generate_notes = sub {
     my $vars = join('|', keys $info->%*);
     $notes_template =~ s/\{\{($vars)\}\}/$info->{$1}/g;
 
-    die "unexpected variable name '$1'\n" if $notes_template =~ m/\{\{([^\s}]+)\}\}/;
-
     return $notes_template;
 };
 
@@ -1325,8 +1346,10 @@ sub verify_vzdump_parameters {
 
     $parse_prune_backups_maxfiles->($param, 'CLI parameters');
 
-    raise_param_exc({'notes-template' => "contains a line feed"})
-       if $param->{'notes-template'} && $param->{'notes-template'} =~ m/\n/;
+    if (my $template = $param->{'notes-template'}) {
+       eval { $verify_notes_template->($template); };
+       raise_param_exc({'notes-template' => $@}) if $@;
+    }
 
     $param->{all} = 1 if (defined($param->{exclude}) && !$param->{pool});