[pve-devel] [PATCH v6 storage 1/1] (remote) export: check and untaint format

Fabian Grünbichler f.gruenbichler at proxmox.com
Wed Sep 28 14:50:59 CEST 2022


this format comes from the remote cluster, so it might not be supported
on the source side - checking whether it's known (as additional
safeguard) and untainting (to avoid open3 failure) is required.

Signed-off-by: Fabian Grünbichler <f.gruenbichler at proxmox.com>
---

Notes:
    v6: new

 PVE/CLI/pvesm.pm | 6 ++----
 PVE/Storage.pm   | 9 +++++++++
 2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/PVE/CLI/pvesm.pm b/PVE/CLI/pvesm.pm
index 003b019..9b9676b 100755
--- a/PVE/CLI/pvesm.pm
+++ b/PVE/CLI/pvesm.pm
@@ -30,8 +30,6 @@ use PVE::CLIHandler;
 
 use base qw(PVE::CLIHandler);
 
-my $KNOWN_EXPORT_FORMATS = ['raw+size', 'tar+size', 'qcow2+size', 'vmdk+size', 'zfs', 'btrfs'];
-
 my $nodename = PVE::INotify::nodename();
 
 sub param_mapping {
@@ -269,7 +267,7 @@ __PACKAGE__->register_method ({
 	    format => {
 		description => "Export stream format",
 		type => 'string',
-		enum => $KNOWN_EXPORT_FORMATS,
+		enum => $PVE::Storage::KNOWN_EXPORT_FORMATS,
 	    },
 	    filename => {
 		description => "Destination file name",
@@ -355,7 +353,7 @@ __PACKAGE__->register_method ({
 	    format => {
 		description => "Import stream format",
 		type => 'string',
-		enum => $KNOWN_EXPORT_FORMATS,
+		enum => $PVE::Storage::KNOWN_EXPORT_FORMATS,
 	    },
 	    filename => {
 		description => "Source file name. For '-' stdin is used, the " .
diff --git a/PVE/Storage.pm b/PVE/Storage.pm
index b9c53a1..ce61fee 100755
--- a/PVE/Storage.pm
+++ b/PVE/Storage.pm
@@ -48,6 +48,8 @@ use constant APIVER => 10;
 # see https://www.gnu.org/software/libtool/manual/html_node/Libtool-versioning.html
 use constant APIAGE => 1;
 
+our $KNOWN_EXPORT_FORMATS = ['raw+size', 'tar+size', 'qcow2+size', 'vmdk+size', 'zfs', 'btrfs'];
+
 # load standard plugins
 PVE::Storage::DirPlugin->register();
 PVE::Storage::LVMPlugin->register();
@@ -1949,6 +1951,13 @@ sub volume_import_start {
 sub volume_export_start {
     my ($cfg, $volid, $format, $log, $opts) = @_;
 
+    my $known_format = [ grep { $_ eq $format } $KNOWN_EXPORT_FORMATS->@* ];
+    if (!$known_format->@*) {
+	die "Cannot export '$volid' using unknown export format '$format'\n";
+    }
+
+    $format = ($known_format->@*)[0];
+
     my $run_command_params = delete $opts->{cmd} // {};
 
     my $cmds = $volume_export_prepare->($cfg, $volid, $format, $log, $opts);
-- 
2.30.2






More information about the pve-devel mailing list