From dd11b0a672feb5932548aa72c4db859889401587 Mon Sep 17 00:00:00 2001 Message-ID: From: Peter Krempa Date: Tue, 30 Jan 2024 17:11:37 +0100 Subject: [PATCH] virNodeDeviceCapVPDFormat: Properly escape system-originated strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Similarly to previous commit other specific fields which come from the system data and aren't sanitized enough to be safe for XML were also formatted via virBufferAsprintf. Other static and safe strings used virBufferEscapeString instead of virBufferAddLit. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko (cherry picked from commit 2ccac1e42f34404e3a5af22671a31fa1dca94e94) https://issues.redhat.com/browse/RHEL-22314 [9.4.0] https://issues.redhat.com/browse/RHEL-22400 [9.3.z] https://issues.redhat.com/browse/RHEL-22399 [9.2.z] --- src/conf/node_device_conf.c | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c index 87c046e571..95de77abe9 100644 --- a/src/conf/node_device_conf.c +++ b/src/conf/node_device_conf.c @@ -270,14 +270,6 @@ virNodeDeviceCapVPDFormatCustomSystemField(virPCIVPDResourceCustom *field, virBu virNodeDeviceCapVPDFormatCustomField(buf, "system_field", field); } -static inline void -virNodeDeviceCapVPDFormatRegularField(virBuffer *buf, const char *keyword, const char *value) -{ - if (keyword == NULL || value == NULL) - return; - - virBufferAsprintf(buf, "<%s>%s\n", keyword, value, keyword); -} static void virNodeDeviceCapVPDFormat(virBuffer *buf, virPCIVPDResource *res) @@ -290,31 +282,33 @@ virNodeDeviceCapVPDFormat(virBuffer *buf, virPCIVPDResource *res) virBufferEscapeString(buf, "%s\n", res->name); if (res->ro != NULL) { - virBufferEscapeString(buf, "\n", "readonly"); - + virBufferAddLit(buf, "\n"); virBufferAdjustIndent(buf, 2); - virNodeDeviceCapVPDFormatRegularField(buf, "change_level", res->ro->change_level); - virNodeDeviceCapVPDFormatRegularField(buf, "manufacture_id", res->ro->manufacture_id); - virNodeDeviceCapVPDFormatRegularField(buf, "part_number", res->ro->part_number); - virNodeDeviceCapVPDFormatRegularField(buf, "serial_number", res->ro->serial_number); + + virBufferEscapeString(buf, "%s\n", res->ro->change_level); + virBufferEscapeString(buf, "%s\n", res->ro->manufacture_id); + virBufferEscapeString(buf, "%s\n", res->ro->part_number); + virBufferEscapeString(buf, "%s\n", res->ro->serial_number); + g_ptr_array_foreach(res->ro->vendor_specific, (GFunc)virNodeDeviceCapVPDFormatCustomVendorField, buf); - virBufferAdjustIndent(buf, -2); + virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "\n"); } if (res->rw != NULL) { - virBufferEscapeString(buf, "\n", "readwrite"); - + virBufferAddLit(buf, "\n"); virBufferAdjustIndent(buf, 2); - virNodeDeviceCapVPDFormatRegularField(buf, "asset_tag", res->rw->asset_tag); + + virBufferEscapeString(buf, "%s\n", res->rw->asset_tag); + g_ptr_array_foreach(res->rw->vendor_specific, (GFunc)virNodeDeviceCapVPDFormatCustomVendorField, buf); g_ptr_array_foreach(res->rw->system_specific, (GFunc)virNodeDeviceCapVPDFormatCustomSystemField, buf); - virBufferAdjustIndent(buf, -2); + virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "\n"); } -- 2.43.0