From nobody Sun Feb 8 20:59:51 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1600868396; cv=none; d=zohomail.com; s=zohoarc; b=iQgS3yLbMfHE15a88Ae2t5kHy9qeH4mYWu6R5x6nlszo0PYxTOXnKdWvFzlYEpO8rIYot/knNrgjRuYbRlrUBKg8EvKkRTjDwUeweHNQO54C4b9Sjjy2NBVv+emPlcwgrJSV4K/cxlHyXADjVrcZZv5p2sm38uZZ/C1nljtwKJE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1600868396; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=EDE6eBsh3chMZ0FNGkujCwNo1vodnt9g5073aQhFnCU=; b=cuPockWA+uiqDD133U192fe4hxatzU6rM95mSPrTtpT6TnPksf5R9rI58BYWfJNZnJiJp2znS73J4bRLV+LgDHBbG6scvyfv8t0M3ii17IAwq/1OgbfgrNYjhRCLSV2FHOr7L9bNU1yfVKJHg6JQsE44apWp+r88QKhevTzJlaY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1600868396026207.16191836234043; Wed, 23 Sep 2020 06:39:56 -0700 (PDT) Received: from localhost ([::1]:58668 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kL4zy-00025c-NF for importer@patchew.org; Wed, 23 Sep 2020 09:39:54 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:37248) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kL4yg-0000QK-62 for qemu-devel@nongnu.org; Wed, 23 Sep 2020 09:38:34 -0400 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:53804) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kL4yc-00060Q-IF for qemu-devel@nongnu.org; Wed, 23 Sep 2020 09:38:32 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-418-fI3PwGO5NJClLokGgI-heA-1; Wed, 23 Sep 2020 09:38:25 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id E58731DDEE; Wed, 23 Sep 2020 13:38:23 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-114-73.ams2.redhat.com [10.36.114.73]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6F2BE60BEC; Wed, 23 Sep 2020 13:38:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1600868308; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=EDE6eBsh3chMZ0FNGkujCwNo1vodnt9g5073aQhFnCU=; b=UdoV2/NpAtnbWkZr5vWDgoyYgsyTnj1GImYX5B0VEv0xP5hg4wCId2lZpmjB1sT128Szzf irMe9cms0NwqgTbnX67RsOW+O32R+dpAfL99pdg6KkyhqH5gjuqSHh+IKp0d4Fngns3AvI iP4S5qfuo/PCq5N7sb4++ZYs2nWgXug= X-MC-Unique: fI3PwGO5NJClLokGgI-heA-1 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Subject: [PATCH v3 1/3] hw/smbios: support loading OEM strings values from a file Date: Wed, 23 Sep 2020 14:38:02 +0100 Message-Id: <20200923133804.2089190-2-berrange@redhat.com> In-Reply-To: <20200923133804.2089190-1-berrange@redhat.com> References: <20200923133804.2089190-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=berrange@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/09/23 00:53:58 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -32 X-Spam_score: -3.3 X-Spam_bar: --- X-Spam_report: (-3.3 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-1.228, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Eduardo Habkost , "Michael S. Tsirkin" , Laszlo Ersek , Markus Armbruster , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , qemu-arm@nongnu.org, Igor Mammedov , Paolo Bonzini , Richard Henderson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Some applications want to pass quite large values for the OEM strings entries. Rather than having huge strings on the command line, it would be better to load them from a file, as supported with -fw_cfg. This introduces the "path" parameter allowing for: $ echo -n "thisthing" > mydata.txt $ qemu-system-x86_64 \ -smbios type=3D11,value=3Dsomething \ -smbios type=3D11,path=3Dmydata.txt \ -smbios type=3D11,value=3Dsomemore \ ...other args... Now in the guest $ dmidecode -t 11 Getting SMBIOS data from sysfs. SMBIOS 2.8 present. Handle 0x0E00, DMI type 11, 5 bytes OEM Strings String 1: something String 2: thisthing String 3: somemore Reviewed-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Daniel P. Berrang=C3=A9 Tested-by: Laszlo Ersek --- hw/smbios/smbios.c | 71 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 58 insertions(+), 13 deletions(-) diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c index 7cc950b41c..d993448087 100644 --- a/hw/smbios/smbios.c +++ b/hw/smbios/smbios.c @@ -110,7 +110,7 @@ static struct { =20 static struct { size_t nvalues; - const char **values; + char **values; } type11; =20 static struct { @@ -314,6 +314,11 @@ static const QemuOptDesc qemu_smbios_type11_opts[] =3D= { .type =3D QEMU_OPT_STRING, .help =3D "OEM string data", }, + { + .name =3D "path", + .type =3D QEMU_OPT_STRING, + .help =3D "OEM string data from file", + }, }; =20 static const QemuOptDesc qemu_smbios_type17_opts[] =3D { @@ -641,6 +646,8 @@ static void smbios_build_type_11_table(void) =20 for (i =3D 0; i < type11.nvalues; i++) { SMBIOS_TABLE_SET_STR_LIST(11, type11.values[i]); + g_free(type11.values[i]); + type11.values[i] =3D NULL; } =20 SMBIOS_BUILD_TABLE_POST; @@ -940,9 +947,8 @@ static void save_opt(const char **dest, QemuOpts *opts,= const char *name) =20 =20 struct opt_list { - const char *name; size_t *ndest; - const char ***dest; + char ***dest; }; =20 static int save_opt_one(void *opaque, @@ -951,23 +957,60 @@ static int save_opt_one(void *opaque, { struct opt_list *opt =3D opaque; =20 - if (!g_str_equal(name, opt->name)) { - return 0; + if (g_str_equal(name, "path")) { + g_autoptr(GByteArray) data =3D g_byte_array_new(); + g_autofree char *buf =3D g_new(char, 4096); + ssize_t ret; + int fd =3D qemu_open(value, O_RDONLY, errp); + if (fd < 0) { + return -1; + } + + while (1) { + ret =3D read(fd, buf, 4096); + if (ret =3D=3D 0) { + break; + } + if (ret < 0) { + error_setg(errp, "Unable to read from %s: %s", + value, strerror(errno)); + return -1; + } + if (memchr(buf, '\0', ret)) { + error_setg(errp, "NUL in OEM strings value in %s", value); + return -1; + } + g_byte_array_append(data, (guint8 *)buf, ret); + } + + close(fd); + + *opt->dest =3D g_renew(char *, *opt->dest, (*opt->ndest) + 1); + (*opt->dest)[*opt->ndest] =3D (char *)g_byte_array_free(data, FAL= SE); + (*opt->ndest)++; + data =3D NULL; + } else if (g_str_equal(name, "value")) { + *opt->dest =3D g_renew(char *, *opt->dest, (*opt->ndest) + 1); + (*opt->dest)[*opt->ndest] =3D g_strdup(value); + (*opt->ndest)++; + } else if (!g_str_equal(name, "type")) { + error_setg(errp, "Unexpected option %s", name); + return -1; } =20 - *opt->dest =3D g_renew(const char *, *opt->dest, (*opt->ndest) + 1); - (*opt->dest)[*opt->ndest] =3D value; - (*opt->ndest)++; return 0; } =20 -static void save_opt_list(size_t *ndest, const char ***dest, - QemuOpts *opts, const char *name) +static bool save_opt_list(size_t *ndest, char ***dest, QemuOpts *opts, + Error **errp) { struct opt_list opt =3D { - name, ndest, dest, + ndest, dest, }; - qemu_opt_foreach(opts, save_opt_one, &opt, NULL); + if (!qemu_opt_foreach(opts, save_opt_one, &opt, errp)) { + return false; + } + return true; } =20 void smbios_entry_add(QemuOpts *opts, Error **errp) @@ -1149,7 +1192,9 @@ void smbios_entry_add(QemuOpts *opts, Error **errp) if (!qemu_opts_validate(opts, qemu_smbios_type11_opts, errp)) { return; } - save_opt_list(&type11.nvalues, &type11.values, opts, "value"); + if (!save_opt_list(&type11.nvalues, &type11.values, opts, errp= )) { + return; + } return; case 17: if (!qemu_opts_validate(opts, qemu_smbios_type17_opts, errp)) { --=20 2.26.2