[pve-devel] [PATCH v4 qemu 1/2] fix #2190: Base64 encode SMBIOS value strings in order to allow more characters

Christian Ebner c.ebner at proxmox.com
Tue Jun 11 12:13:52 CEST 2019


On some occasions e.g. license checking, the manufacturer string in the
SMBIOS settings edit has to allow characters such as whitespaces.
https://forum.proxmox.com/threads/proxmox-and-windows-rok-license-for-dell.53236/
In principle SMBIOS allows to pass any zero terminated string to the
corresponding fields in the structure type 1 (System Information).

By base64 encoding the values clashing of the config is avoided.

Relies on the corresponding patch to pve-manager to obtain base64 encoded values.

Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
---
Version 4:
    * Improved regex for base64 encoded strings

 PVE/QemuServer.pm | 53 +++++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 39 insertions(+), 14 deletions(-)

diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 1f27a0b..c6d95e5 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -21,6 +21,7 @@ use JSON;
 use Fcntl;
 use PVE::SafeSyslog;
 use Storable qw(dclone);
+use MIME::Base64;
 use PVE::Exception qw(raise raise_param_exc);
 use PVE::Storage;
 use PVE::Tools qw(run_command lock_file lock_file_full file_read_firstline dir_glob_foreach $IPV6RE);
@@ -2358,7 +2359,7 @@ sub vmconfig_cleanup_pending {
     return $changes;
 }
 
-# smbios: [manufacturer=str][,product=str][,version=str][,serial=str][,uuid=uuid][,sku=str][,family=str]
+# smbios: [manufacturer=str][,product=str][,version=str][,serial=str][,uuid=uuid][,sku=str][,family=str][,base64=bool]
 my $smbios1_fmt = {
     uuid => {
 	type => 'string',
@@ -2369,46 +2370,51 @@ my $smbios1_fmt = {
     },
     version => {
 	type => 'string',
-	pattern => '\S+',
-	format_description => 'string',
+	pattern => '[A-Za-z0-9+\/]+={0,2}',
+	format_description => 'Base64 encoded string',
         description => "Set SMBIOS1 version.",
 	optional => 1,
     },
     serial => {
 	type => 'string',
-	pattern => '\S+',
-	format_description => 'string',
+	pattern => '[A-Za-z0-9+\/]+={0,2}',
+	format_description => 'Base64 encoded string',
         description => "Set SMBIOS1 serial number.",
 	optional => 1,
     },
     manufacturer => {
 	type => 'string',
-	pattern => '\S+',
-	format_description => 'string',
+	pattern => '[A-Za-z0-9+\/]+={0,2}',
+	format_description => 'Base64 encoded string',
         description => "Set SMBIOS1 manufacturer.",
 	optional => 1,
     },
     product => {
 	type => 'string',
-	pattern => '\S+',
-	format_description => 'string',
+	pattern => '[A-Za-z0-9+\/]+={0,2}',
+	format_description => 'Base64 encoded string',
         description => "Set SMBIOS1 product ID.",
 	optional => 1,
     },
     sku => {
 	type => 'string',
-	pattern => '\S+',
-	format_description => 'string',
+	pattern => '[A-Za-z0-9+\/]+={0,2}',
+	format_description => 'Base64 encoded string',
         description => "Set SMBIOS1 SKU string.",
 	optional => 1,
     },
     family => {
 	type => 'string',
-	pattern => '\S+',
-	format_description => 'string',
+	pattern => '[A-Za-z0-9+\/]+={0,2}',
+	format_description => 'Base64 encoded string',
         description => "Set SMBIOS1 family string.",
 	optional => 1,
     },
+    base64 => {
+	type => 'boolean',
+	description => 'Flag to indicate that the SMBIOS values are base64 encoded',
+	optional => 1,
+    },
 };
 
 sub parse_smbios1 {
@@ -3524,7 +3530,26 @@ sub config_to_command {
     push @$cmd, '-daemonize';
 
     if ($conf->{smbios1}) {
-	push @$cmd, '-smbios', "type=1,$conf->{smbios1}";
+	my $smbios_conf = parse_smbios1($conf->{smbios1});
+	if ($smbios_conf->{base64}) {
+	    # Do not pass base64 flag to qemu
+	    delete $smbios_conf->{base64};
+	    my $smbios_string = "";
+	    foreach my $key (keys %$smbios_conf) {
+		my $value;
+		if ($key eq "uuid") {
+		    $value = $smbios_conf->{uuid}
+		} else {
+		    $value = decode_base64($smbios_conf->{$key});
+		}
+		# qemu accepts any binary data, only commas need escaping by double comma
+		$value =~ s/,/,,/g;
+		$smbios_string .= "," . $key . "=" . $value if $value;
+	    }
+	    push @$cmd, '-smbios', "type=1" . $smbios_string;
+	} else {
+	    push @$cmd, '-smbios', "type=1,$conf->{smbios1}";
+	}
     }
 
     if ($conf->{vmgenid}) {
-- 
2.11.0




More information about the pve-devel mailing list