From: Peter Krempa Date: Tue, 30 Jan 2024 16:11:37 +0000 (+0100) Subject: virNodeDeviceCapVPDFormat: Properly escape system-originated strings X-Git-Tag: v10.1.0-rc1~156 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2ccac1e42f34404e3a5af22671a31fa1dca94e94;p=thirdparty%2Flibvirt.git virNodeDeviceCapVPDFormat: Properly escape system-originated strings 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 --- 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"); }